코딩테스트 문제풀이/programmers

프로그래머스 node.js - [1차] 비밀지도

sangchu 2024. 5. 27. 17:20

문제 링크

링크

풀이

function solution(n, arr1, arr2){
    let map1 = arr1;
    let map2 = arr2;
    let answer = [];
    
    // 이진수 변환 후, n에 맞춰서 앞에 0을 채워서 반환
    map1 = map1.map((num) => num.toString(2).padStart(n,"0")); 
    map2 = map2.map((num) => num.toString(2).padStart(n,"0")); 
    
    // n개의 행 연산
    for(let i = 0; i < n; i++){
        let line = "";        
        let [map1Index, map2Index] = [map1[i], map2[i]]
        // 각 행의 지도값 비교
        for(let j = 0; j < n; j++){
            if(map1Index[j] === "1" || map2Index[j] ==="1") line+="#";
            else line +=" ";
        }
        answer.push(line);
    }
    return answer;
}


console.log(5,[9, 20, 28, 18, 11],[30, 1, 21, 17, 28])

 

문제 조건 분석

  • 한변 길이가 n인 정사각형 지도
  • 지도 각 칸은 공백(” “)과 벽(”#”)으로 이루어져 있음
  • 하나라도 벽이면 전체 지도에서도 벽 → 지도1(벽) OR 지도2(벽)
  • 지도의 각 행은 정수 배열로 주어지는데, 이진수 변환시 공백은 0, 벽은 1

 

풀이 과정

  1. map1, map2에서 각 줄을 이진수 배열을 만듭니다. toString 메서드를 이용해 이진수로 변환했는데, n의 길이를 맞추기 위해 부족한 길이만큼 앞에 0을 추가했습니다.
    • 2진수 변환 : 숫자.toString(진수)
    • 문자열 앞에 문자 넣기: 문자열.padStart(총길이, 채울문자)
  2. 각 행을 의미하는 line 변수를 만들고 n행을 순환합니다. map1과 map2를 비교해 둘 중 하나라도 1이 있으면 #을 추가하고, 그 외에는 공백을 추가합니다.
  3. 해당 값을 answer 배열에 넣습니다.