function solution(n, arr1, arr2) {
let arr12D = [];
let arr22D = [];
// arr1과 arr2를 2진수로 변환 후, 2차원 배열로 표현
for(let i = 0; i < arr1.length; i++){
let decimal1 = arr1[i];
let decimal2 = arr2[i];
let binary1 = decimal1.toString(2).padStart(n, 0);
let binary2 = decimal2.toString(2).padStart(n, 0);
arr12D.push(binary1.split("").map((item) => Number(item)));
arr22D.push(binary2.split("").map((item) => Number(item)));
}
let ans = [];
for(let i = 0; i < arr12D.length; i++){
let str = "";
for(let j = 0; j < arr12D[0].length; j++){
// 둘 다 0이면 공백이다.
if(arr12D[i][j] === 0 && arr22D[i][j] === 0){
str += " ";
} else if(arr12D[i][j] === 1 || arr22D[i][j] === 1){
// 하나라도 1이면 벽이다.
str += "#";
}
}
ans.push(str);
}
return ans;
}
이 문제는 문제 예시에 그림과 10진수 2진수 변환이 없었다면 못 풀었을지도 모르겠다는 생각이 든다.
방법은 간단하다.
주어진 배열의 각 배열값인 10진수들을 2진수로 변환한다.
n x n의 정사각형이므로 남는 자리는 padStart를 사용해서 0으로 채워줘야한다.
그렇게 하나의 10진수를 여러개의 2진수로 표현했으므로, 1차원 배열이었던 것이 2차원 배열로 표현될 것이다.
2차원 배열로 표현된 arr1, arr2의 같은 위치 원소값들을 비교해서
모두 0이면 " "(공백)을 str에 추가하고
하나라도 1이면 "#"(벽)을 str에 추가한다.
그렇게 2차원 배열의 1차원 배열 하나를 처리 완료하면
ans 배열에 str을 push한다.
위 과정을 마치면
2차원 배열로 변했던 것이 다시 1차원 배열로 돌아오게된다.
이를 출력하면 끝이다.
var solution=(n,a,b)=>a.map((a,i)=>(a|b[i]).toString(2).padStart(n,0).replace(/0/g,' ').replace(/1/g,'#'))
충격 그 자체. 20분 걸려서 푼 거를 단 한 줄에 적어놓으셨다.
카카오 공식 해설집에 따르면 비트 연산자 활용에 대한 능력을 평가한 것이라고 하는데,
의도한대로 풀어내신 것 같다.
a | b[i]
이 부분이 비트 연산자 OR에 해당하는 부분인데
하나라도 1이면 1이되고, 모두 0이어야지 0이 되는 것으로
문제에서 공백과 벽을 표현하는 것을 쉽게 표현할 수 있다.
문제처럼 10진수를 넣어서 계산하면 비트 연산자를 통해 어떠한 10진수로 변하게 되고,
이를 toString(2)로 2진수로 변환했다.
padStart는 필자의 생각과 동일한 이유리라 예상된다.
자, 그렇게 벽과 공백을 표현하기 위한 2진수는 모두 구했고
숫자에 맞춰 문자열로 변환시키면 된다.
정규식을 사용하신 것 같은데, 0은 공백, 1은 벽을 바꿔넣어주셨다.
이미 앞에서 비트 연산자 연산이 마무리되서 추가적인 조건문 같은 것은 필요없다.