https://programmers.co.kr/learn/courses/30/lessons/17681
function solution(n, arr1, arr2) {
arr1 = changeMap(arr1,n);
arr2 = changeMap(arr2, n);
let tmap = makeMap(n);
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (arr1[i][j] == '1' || arr2[i][j] == '1') tmap[i][j] = '#';
}
}
let answer = tmap.map(el => { return el.join('').replace(/0/gi, ' ')});
return answer;
}
function makeMap(n) {
let tmp = [];
for (let i = 0; i < n; i++) {
tmp[i] = [];
for (let j = 0; j < n; j++) {
tmp[i][j] = 0
}
}
return tmp;
}
function changeMap(arr,n) {
let tmp = arr.map((el) => {
let ch = el.toString(2).split('')
if (ch.length < n) {
for (let i = ch.length; i < n; i++) {
ch.unshift('0')
}
}
return ch;
});
return tmp;
}
let n = 5;
let arr1 = [9, 20, 28, 18, 11];
let arr2 = [30, 1, 21, 17, 28];
console.log(solution(n, arr1, arr2));
바로 뭐 떠오른 방법은 없어서 하나씩 완성해가봤다.
우선 changeMap()을 통해 arr1, arr2안에 있는 숫자를 2진수로 바꾼다.
이때 2진수의 길이가 n보다 작으면 길이가 n이 될때까지 앞에 0을 넣어준다.
그 다음 두 맵의 상태에 따라 저장해둘 tmap을 만들고, arr1과 arr2가 1이면 벽이니까 tmap에 #을 설정한다.
설정이 완료되면 위 테스트케이스 경우 아래처럼 나올 것이다.
[
[ '#', '#', '#', '#', '#' ],
[ '#', 0, '#', 0, '#' ],
[ '#', '#', '#', 0, '#' ],
[ '#', 0, 0, '#', '#' ],
[ '#', '#', '#', '#', '#' ]
]
정답의 형태처럼만들기 위해 map을 이용해 새로운 배열을 만들어 답을 도출한다.
각요소를 하나의 문자열로 만들기 위해 join을 사용하고,
0부분을 공백으로 고치기위해 replace를 사용한다.
그러면 정답이 나오게된다.