(프로그래머/JS) #17681 – (1차) Secret Map

쉬운 목차

문제

문제를 보여

Neo는 Frodo가 보통 비상 자금을 어디에 숨기는지 알려주는 비밀 지도를 받았습니다. 하지만 이 비밀 지도는 숫자로 암호화되어 있기 때문에 위치를 파악하기 위해서는 복호화를 거쳐야 합니다. 운 좋게도 카드 코드를 해독하는 방법에 대한 지침이 담긴 메모도 찾았습니다.

1. 맵은 변의 길이가 n인 정사각형 배열 형태이며, 각 셀은 “공백”(” “) 또는 “벽”(“#”)의 두 가지 유형으로 구성됩니다.
2. 두 개의 지도를 겹쳐서 완성된 지도를 얻을 수 있습니다. 각각 “카드 1″과 “카드 2″라고 부르겠습니다. 맵 1 또는 맵 2에서 벽인 부분은 전체 맵에서도 벽입니다. 지도 1과 지도 2 모두에서 비어 있는 영역은 전체 지도에서도 비어 있습니다.
3. 맵 1과 맵 2는 각각 정수 배열로 인코딩됩니다.
4. 인코딩된 배열은 맵의 각 가로 행에서 벽 부분을 1로, 빈 부분을 0으로 인코딩하여 얻은 이진수에 해당하는 값의 배열입니다.



Neo가 Frodo의 비상 자금을 얻을 수 있도록 비밀 지도를 해독하는 데 도움이 되는 프로그램을 작성하세요.

– 입력 형식
입력은 지도의 한 면의 크기 n과 두 개의 정수 배열 arr1 및 arr2입니다.

– 1≤n≤16
– arr1, arr2는 길이 n의 정수 배열로 지정됩니다.
– 정수형 배열의 각 원소 x를 이진수로 변환하면 길이는 n보다 작아지므로 0 ≤ x ≤ 2n – 1을 만족한다.

– 출력 형식
원본 비밀 지도를 디코딩하고 “#”과 공백으로 구성된 문자열 배열로 출력합니다.



해결책

문제 분석
– 측면이 n인 정사각형 배열(n * n)
– 공백 ” ” 또는 벽 “#”
– 전체 맵 = 맵 1 + 맵 2
– 각 카드는 정수의 배열로 구성됨 -> 이진수에 해당
– 벽 = 방 1개 = 0
전체 맵(#, ‘ ‘)으로 구성된 배열을 반환합니다.

문제를 해결하다
1. 전체 맵(배열)은 배열의 요소에 들어가기 위해 문자열이 필요합니다.
2. 각 매개변수 배열을 10진수에서 2진수(arr1, arr2)로 변환하여 벽과 간격을 찾습니다.
3. 각각의 배열 값을 합쳐 전체 맵 생성 -> 매개변수 중 하나라도 1이면 벽이므로 ’00’이면 ‘ ‘, 아니면 ‘#’

function solution(n, arr1, arr2) {
    let answer = ();
    let list = "";
    
    for(let i = 0; i < n; i++){
        let a = arr1(i).toString(2).padStart(n, '0');
        let b = arr2(i).toString(2).padStart(n, '0');
        for(let j = 0; j < n; j++){
            if (a(j) + b(j) === '00') list += ' ';
            else list += '#';
        }
        answer.push(list);
        list = "";
    }
    
    return answer;
}

arr(i).toString(2)을 사용하여 10진수를 2진수로 변환할 때 선행 0이 있으면 값이 처음에 올바르게 도착하지 않습니다.
그래서 0을 더하는 방법을 찾아봤더니 padStart() 메서드를 사용해서 문제가 해결되었어요!
padStart(n, s) 메서드는 문자열의 길이가 n보다 작은 경우 남은 길이만큼 s를 채웁니다.