• (자바스크립트 알고리즘) 비밀지도 - kimyang-sun

    2020. 10. 16.

    by. kimyang-Sun

    자바스크립트 알고리즘 (Programmers)


    문제 설명

    S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

     

    물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

     

    부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.

    1. 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 공백(" ) 또는벽(#") 두 종류로 이루어져 있다.
    2. 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 지도 1과 지도 2라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.
    3. 지도 1과 지도 2는 각각 정수 배열로 암호화되어 있다.
    4. 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.

    네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.

     

    입력 형식

    입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.

    • 1 ≦ n ≦ 16
    • arr1, arr2는 길이 n인 정수 배열로 주어진다.
    • 정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.

     

    출력 형식

    원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.

     

     

     

    입출력 예


    문제 풀이

    function solution(n, arr1, arr2) {
        const arrBinaryNumber1 = arr1.map(value => value.toString(2));
        const arrBinaryNumber2 = arr2.map(value => value.toString(2));    
        const answer = arrBinaryNumber1.map((value, i) => {
            let string = String(Number(value) + Number(arrBinaryNumber2[i]));
            return ("0".repeat(n - string.length) + string)
            .split("")
            .map(num => num === "0" ? " " : "#")
            .join("");
        })
        return answer;
    }

    풀이입니다.

     

    매개변수 배열 arr1과 arr2를 각각 map()과 toString(2)를 이용해 2진수로 변화시킨 배열을 만들어주고

     

    그중 하나에 map() 을 또 사용하여 string이라는 변수에 Number(value) + Number(arrBinaryNumber2[i]) 값을

     

    String()으로 문자열로 변경해주고 변한 문자열에서 빈자리를 0 으로 채워주어야 하기때문에

     

    repeat을 이용하여 0을 채워줍니다.

     

    그 후에는 배열 안의 배열로 만들어주기위해 split("")을 사용해주고 다시 map()으로 각각을 0과 비교하여

     

    " " or "#"를 넣어줍니다.

     

    그 후에는 join("")을 통해 문자열로 다시 만들어줍니다.

     

    다른 사람들의 풀이

    function solution(n, arr1, arr2) {
        return arr1.map((v, i) => addZero(n, (v | arr2[i]).toString(2)).replace(/1|0/g, a => +a ? '#' : ' '));
    }
    
    const addZero = (n, s) => {
        return '0'.repeat(n - s.length) + s;
    }

    댓글