문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/17681

- 지도 1과 지도 2가 주어진다.

- 각 지도는 n x n이다.

- 지도 1과 지도 2는 벽 또는 공백으로 이루어져 있다.

- 전체 지도는 지도 1과 지도 2를 이용해 알 수 있다.

 - 두 지도 모두 공백이면 전제 지도에서도 해당 자리는 공백이며, 두 지도 중 하나라도 벽이라면 전체 지도에서도 벽이다.

- 두 지도는 10진수로 이루어진 일차원 배열로 주어지며, 이진수로 변경했을 때 0이 공백, 1이 #이다.

 

입출력 예제 설명

arr1과 arr2

arr1이 [9, 20, 28, 18, 11] 인데 이걸 이진수로 변환하면 [01001, 10100, 11100, 10010, 01011]이 된다. 각 배열의 원소를 이진수로 바꾼 값이 행이라고 생각하면 된다. 

 

코드

// " " : 공백
// "#" : 벽
// 둘 다 공백이면 전체 지도에서도 공백
// 하나라도 벽이 있으면 전체 지도에서도 벽
function solution(n, arr1, arr2) {
    const map = [];
    
    arr1.forEach((num1, idx)=>{   
        map.push((num1 | arr2[idx]).toString(2).padStart(n, '0').replaceAll('1', '#').replaceAll('0', ' '));  
    });
    
    return map;
}

문제에서 둘 다 공백일 때는 전체 지도도 공백이라고 하였고, 둘 중 하나라도 벽이라면 전체 지도에서도 벽이라고 되어있다. 이때, 공백을 표현하는 것이 0이며 벽을 표현하는 것이 1이기 때문에 ` 0 ? 0 = 0 ` , ` 0 ? 1 = 1 ` , ` 1 ? 0 = 1 ` 에서 ?에 들어가는 것은 ` OR(|) ` 가 된다.

 

따라서, 지도1과 지도2의 각각의 행을 | 연산을 해준 후 2진수로 변환해준다. `Array.prototype.toString(radix) ` 를 이용하면 10진수를 쉽게 2진수로 변환할 수 있다. 이때, 0101 이라는 결과가 나오면 JS에서는 101이라고 표시를 해주기 때문에, ` String.prototype.padStart() ` 를 이용하여 n 자리보다 자릿수가 적으면 앞에 빈 자리를 0으로 채울 수 있도록 했다.

 

마지막으로, 문제에서 원하는 것은 1을 #이로, 0을 공백으로 표시하는 것이기 때문에 `String.prototype.replace()`를 이용하여 1과 0을 원하는 값으로 변경해준다. 그리고 해당 값을 map 배열에 push 하여 map 배열을 리턴하도록 했다.

728x90

+ Recent posts