프론트엔드 개발자의 기록 공간

[프로그래머스 JavaScript] 1차 비밀지도 본문

알고리즘_JS/프로그래머스_Level1

[프로그래머스 JavaScript] 1차 비밀지도

[리우] 2021. 6. 9. 16:35

프로그래머스 Level1 [1]차 비밀지도 -> 2018 KAKA BLIND 문제

 

문제 설명 : arr1, arr2 두개의 지도가 주어질때 두개의 지도를 합쳐서 빈공간이 있다면 " " 빈 문자

빈공간이 없다면 "#"로 치환하여 출력해야하는 문제이다.

 

저는 문제접근을 다음과 같이 구상했습니다. 

1. 암호화된 두개의 지도를 2진법으로 변환

2. 변환된 두개의 지도값을 더해 전체 지도의에 넣어준다.

 

위 조건에서 알 수 있듯이 하나라도 겹치면 벽이 되기 때문에 1이상일 것이다.

 

3. 2번 과정을 거친 전체 지도는 빈공간이 있다면 0 아니면 1이상의 값을 가질 것이다.

 

4. 전체지도를 탐색하면서 0일 경우 " " 그외에는 "#"으로 변환하여 answer배열에 삽입

 

function solution(n, arr1, arr2) {
    var answer = [];
    //전체 지도
    let map = Array.from(Array(n), ()=> new Array(n).fill(0));

    //두개의 지도를 각각 변환
    for(let i=0; i<n; i++){
        //2진법으로 변환
        let tmp1 = arr1[i].toString(2);
        let tmp2 = arr2[i].toString(2);

        //5자리로 맞춤 입력길이가 얼마인지 모르므로 최대한 크게..
        let str1 = "00000000" + tmp1;
        str1 = str1.slice(-n);
        let str2 = "00000000" + tmp2;
        str2 = str2.slice(-n);
        
        //정수형 배열로 변환
        str1 = str1.split("").map((el) => parseInt(el));
        str2 = str2.split("").map((el) => parseInt(el));
        
        //두개 지도 값 더해서 전체 지도에 넣기
        map[i] = map[i].map((el,idx) => str1[idx]+str2[idx]);
    }
    //위 과정을 거치고 나면 지도의 공백부분은 0,
    //벽인 부분은 1이상의 값이 될 것이다.
    
    //이중 반복문을 통해 비밀지도 해독하여 문자열로 변환
    for(let i of map){
        let result = ""
        for(let j of i){
            if(j === 0){
                result += " "
            }else result += "#"
        }
        answer.push(result);
    }
    
    return answer;
}

코드 설명 : 위의 조건대로 코드를 작성하면된다. 예외적인 경우만 추가적으로 고려해준다. 

2진법으로 변환된 문자를 입력으로 주어지는 n의 크기에 맞춰야하므로 해당 로직을 처리하는 부분과

처리하고 난 후 정수형 배열로 바꿔주는 부분만 추가해주면된다.

 

728x90
Comments