보물지도

프로그래머스 레벨 1 문제의 난이도는 정말 다양하지만.. 위 문제는 레벨 1 문제중 역대급으로 다양한 아이디어를 활용했다.

나의 최종 풀이는 아래와 같다.

function solution(n, arr1, arr2) {
    return arr1.map((elem, index) => elem | arr2[index])
    .map((elem, _) => elem.toString(2).padStart(n, "0"))
    .map((elem, _) => elem.replace(/1/g, "#").replace(/0/g, " "))
}

STEP 1   비트연산

지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다
즉 0 과 1 을 비교했을 때 1 이 되어야 하므로, OR 연산(|)을 수행했다.

STEP 2   2진수 변환 및 자릿수 맞추기

비트연산 수행 결과를 2진수로 변환하기 위해 Object.prototye.toString(2) 를 사용했다.
2진수(문자열)의 자릿수를 맞추기 위해 string.prototype.padStart(targetLength, padString) 함수를 이용했다.

padStart 함수를 모르던 나는 처음 시도때 아래와 같이 풀었었다.

    /* ~ */
    .map((elem, _) => {
        const bi = elem.toString(2);
        return bi.length !== n ? "0".repeat(n - bi.length) + bi : bi;
    })
    /* ~ */

STEP 3   숫자 1은 #으로, 0은 공백으로 치환하기

모든 1과 0을 각각 #, 공백으로 치환해야 했기 때문에, 당연히(?) replaceAll 함수를 사용하려 했다.
하지만 배열의 모든 요소가 분명히 string 인데도, replaceAll is not a function 라는 오류를 뿜어댔다.
대안책으로 global flag 를 사용한 정규식과 replace 함수를 이용했다.

참고자료

replaceAll is not a function Error in JavaScript

카테고리:

업데이트:

댓글남기기