가치투자자

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

Problem Solving/Programmers

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

미주민 2023. 6. 22. 05:29
728x90
반응형

Programmers : 비밀지도

 

🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/17681

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


💬 문제

이 문제는  진수변환 과  문자열 에 대한 이해가 있다면, 충분히 풀 수 있는 문제였다.

 

  1. 암호화된 비밀지도를 풀기 위해 지도의 한 변의 길이 n과 정수 배열 arr1(지도1)과 arr2(지도2)가 주어진다.

    - 각 배열의 정수를 이진수로 변환했을 때, 이진수의 0과 1이 지도의 공백(" ")과 벽("#")에 대한 정보이다

  2. 두 지도를 겹쳤을 때 

    - 모두 공백인 자리는 공백이며,

    - 둘 중 어느 하나라도 벽이 있다면 그 자리는 벽이다

  3. 두 지도를 겹쳐서 최종 지도의 모습(배열)을 출력해주면 된다.

 

728x90

 


💡 입출력 예시

첫 번째 예제를 보면 배열 arr1를 이진법으로 변환하면 [1001, 10100, 11100, 10010, 1011]이 되며, 배열 arr2를 이진법으로 변환하면 [11110, 1, 10101, 10001, 11100]이 된다.

이 두 배열을 겹쳤을 때, [11111, 10101, 11101, 10011, 11111]이 되므로, 결과는 ['#####', '# # #', '### #', '#  ##', '#####']이 된다.

 

 

반응형

 


🔑 풀이1

  • 배열 arr1와 arr2를 이진수로 변환해준다.

  • 두 지도를 겹치기 위해 각 줄의 수를 더해준다.

    - 이때 n자리수가 아닐 수 있으므로 padStart() 메서드를 사용해 아닌 부분은 0으로 채워준다

    - 이진수끼리 더했으므로 각 자리수는 0, 1, 2 중 하나이다

  • 둘 다 공백(0)인 경우에만 공백이므로, 0과 0을 더한 0일 때만 공백(" ")이 나와야 한다.

    - 그 외에 1과 2는 벽("#")으로 바꿔준다.
function solution(n, arr1, arr2) {
    const answer = [];
    const sum = [];
    
    // 진수변환
    let one = arr1.map(num => num.toString(2));
    let two = arr2.map(num => num.toString(2));
    // 두 지도 겹치기
    for (let i=0; i < n; i++) {
        sum.push(
            String(Number(one[i])+Number(two[i])).padStart(n, 0)
        );
    }
    // 공백인지, 벽인지 판별
    for (let num of sum) {
        answer.push(
            num.replace(/0/g, " ").replace(/1|2/g, "#")
        );
    }
    return answer;
}

 

실행 결과와 채점 결과는 다음과 같다.

 

 

 


🔑 풀이2 : 비트 연산자

이 문제는  비트 OR 연산자 로도 풀 수 있다.
비트 연산자는 비트(bit) 단위로 이진수(binary)에 대한 논리 연산을 수행하는 연산자이다. 비트 연산자 중 OR 연산자는 대응대는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트 모두 0일때만 0을 반환한다.

예를 들어, 2와 3의 비트 OR 연산자 결과는 다음과 같다.

십진수가 있다면, 그것을 이진수로 바꿔 비교한 다음 그걸 다시 십진수로 반환해준다.

const num = 2 | 3;
// 2  0010
// 3  0011
//    0011
console.log(num);   // 3

 

문제 풀이2

 

  • n줄에 걸쳐 배열1과 배열2의 각 수를 비트 OR 연산자로 비교하여 두 지도를 겹쳐준다.

    - 둘 다 공백일 때만 0이 되므로, 비트 OR 연산자를 사용하면 0 | 0은 0을 반환해준다

    - 둘 중 하나라도 벽(1)이 있다면, 하나라도 1이 있으므로 비트 OR 연산자는 1을 반환해준다

  • 겹친 결과를 이진수로 바꾸고, n자리수를 채워주기 위해 padStart() 메서드로 0을 채워준다.

  • 겹친 결과는 0 또는 1로 구성된 이진수이므로, 정규표현식으로 공백(" ") 또는 벽("#")으로 바꿔준다.
function solution(n, arr1, arr2) {
    const answer = [];
    
    for (let i=0; i < n; i++) {
        answer.push(
            (arr1[i] | arr2[i]).toString(2)  // 두 지도 겹치기
            .padStart(n, 0)
            .replace(/0/g, " ").replace(/1/g, "#")  // 공백인지, 벽인지 판별
        )
    }
    return answer;
}

 

실행 결과와 채점 결과는 다음과 같다.

 

 

 


</> 끊임없이 성장하기 위해 공부한 내용을 글로 작성하고 있습니다. 틀린 부분이나 추가해야 할 부분이 있다면 언제든 댓글로 남겨주세요❗️

 


References

 

 

728x90
반응형