네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.
입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
매개변수 값
n 5
arr1 [9, 20, 28, 18, 11]
arr2 [30, 1, 21, 17, 28]
출력 ["#####","# # #", "### #", "# ##", "#####"]
매개변수 값
n 6
arr1 [46, 33, 33 ,22, 31, 50]
arr2 [27 ,56, 19, 14, 14, 10]
출력 ["######", "### #", "## ##", " #### ", " #####", "### # "]
function solution(n, arr1, arr2) {
var answer = [];
// arr1 과 arr2를 각각 이진수로 바꾸기
let arr1_bin = arr1.map(n => n.toString(2));
let arr2_bin = arr2.map(n => n.toString(2));
// 앞에있는 0은 생략된다! 0 없는 만큼 앞에 넣어주기
for(let i=0;i<n;i++){
if(arr1_bin[i].length < n) arr1_bin[i] = "0".repeat(n - arr1_bin[i].length)+arr1_bin[i]
if(arr2_bin[i].length < n) arr2_bin[i] = "0".repeat(n - arr2_bin[i].length)+arr2_bin[i]
}
// 각각 0 -> "", 1 -> "#" 으로 바꾸기
let arr1_ch = arr1_bin.map(n => [...n].map(v => v == 1 ? "#" : " ").join(
''))
let arr2_ch = arr2_bin.map(n => [...n].map(v => v == 1 ? "#" : " ").join(
''))
// 두 배열을 비교해서 둘 다 공백일 때만 공백, 아니면 "#"으로 바꾸기.
for(let i=0;i<n;i++){
let p = "";
for(let j=0;j<n;j++){
if(arr1_ch[i][j] == " " && arr2_ch[i][j] == " ") p+=(" ");
else p+=("#")
}
answer.push(p)
}
return answer;
}
function solution(n, arr1, arr2) {
return arr1.map((v, i) => addZero(n, (v | arr2[i]).toString(2)).replace(/1|0/g, a => +a ? '#' : ' '));
}
const addZero = (n, s) => {
return '0'.repeat(n - s.length) + s;
}