728x90
https://school.programmers.co.kr/learn/courses/30/lessons/17681
본 포스팅에서 다루는 문제는 위 프로그래머스 링크를 통하여 문제 확인 및 풀이가 가능합니다!
1. 정답 코드
function solution(n, arr1, arr2) {
// 최종 결과값이 n 크기의 문자열 배열이기 때문에 형식 통일
const arr = new Array(n).fill("");
for (let i = 0; i < n; i++) {
// arr1, arr2 각각 i번째 숫자를 추출하여 진수 변환 진행
numDecimal1 = arr1[i].toString(2).padStart(n, '0');
numDecimal2 = arr2[i].toString(2).padStart(n, '0');
for (let j = 0; j < n; j++) {
if (parseInt(numDecimal1[j]) || parseInt(numDecimal2[j])) {
arr[i] += '#';
} else {
arr[i] += ' ';
}
}
}
return arr;
}
2. 문제 풀이
본 문제의 주요 키 포인트는 2가지입니다. 문제를 보신 분들이라면 첫 번째는 당연히 '진수 변환'이라고 생각할 것 같습니다. 10진수로 작성되어 있는 비밀지도의 암호를 2진수로 변환한 뒤 0, 1 여부를 비교하여 벽인지 길인지 구분해야 하는 것이 문제 풀이의 전부이기 때문입니다.
자바스크립트에서는 toString 메서드를 통하여 매우 간단하게 진수 변환을 할 수 있습니다.
let decimal = 10;
console.log(decimal.toString(2)); // '1010'
console.log(decimal.toString(8)); // '12'
console.log(decimal.toString(16)); // 'a'
하지만 이 경우에서 주의해야할 점은 우리는 문제에서 10진수를 2진수로 변환할 때 n자리의 2진수로 표현해야 한다는 것입니다.
예를 들어 n이 5인 경우에는 9를 2진수로 변환한 결과로 5자리의 '01001'가 필요하다는 것입니다. 하지만 toString(2)만 이용하는 경우에는 접두로 붙는 0들은 모두 제거되어 '1001'로 나오게 됩니다.
두 번째 키 포인트는 2진수로 변환한 결과를 n자리 수로 나타내야 한다는 것입니다. 부족한 자리는 앞에 '0'을 채워주는 작업이 필요하다는 것이지요.
let decimalNum = 9; // 9
let binaryNum = decimalNum.toString(2); // '1001'
// padStart의 첫 번째 인자로 자릿수를 지정하고, 두 번째 인자로는 추가할 문자열을 입력합니다.
let paddingNum = binaryNum.padStart(5, '0'); // '01001'
자바스크립트에서는 이 역시 padStart 메서드를 통하여 접두에 특정 문자열을 채울 수 있습니다.
이 두 가지 문제에 유의하면 나머지는 단순 비교, 구현 문제이기 때문에 쉽게 풀이할 수 있습니다. 진수 변환 및 padding 처리가 가능한 지를 물어보는 문제 정도로 생각할 수 있겠습니다.
728x90
'알고리즘' 카테고리의 다른 글
[알고리즘] 코딩테스트 연습 - [JavaScript] 최솟값 만들기 (0) | 2024.04.04 |
---|---|
[알고리즘] 코딩테스트 연습 - [JavaScript] 달리기 경주 (0) | 2024.03.25 |
[알고리즘] Summer/Winter Coding(~2018) - [JavaScript] 점프와 순간 이동 (4) | 2024.03.18 |
[알고리즘] PCCP 기출 문제 1번 - [JavaScript] 붕대 감기 (2) | 2024.03.16 |
[알고리즘] Summer/Winter Coding(~2018) - [JavaScript] 스킬트리 (2) | 2024.03.07 |