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

ppyororong_0_0·2022년 1월 18일
0

프로그래머스

목록 보기
12/19

[프로그래머스 - 1단계][1차] 비밀지도 문제

https://programmers.co.kr/learn/courses/30/lessons/17681?language=javascript

📝 문제 설명

지도: 한 변의 길이가 n인 정사각형 배열
지도1과 지도2는 정수 배열로 암호화되어 있음
암호화를 풀면 -> 지도의 벽 부분: 1, 공백부분 : 0
정수를 이진수로 바꾸어 암호 해독한다.


암호화된 지도1과 지도2에서 어느 하나라도 벽인 부분은
원래 지도에서도 벽이고,
지도1과 지도2에서 모두 공백이라면
원래 지도에서도 공백이다.


암호화된 지도들을 해독하여 원래의 비밀지도를 '#'과 공백으로 구성된 문자열 배열로 출력

💡 풀이

1. answer배열 : 길이가 n만큼인 배열 생성

2. arr1과 arr2 지도에 있는 자연수들 -> 이진수로 변환

  • 이진수 변환 방법: toString()함수 사용
  • temp배열 : 이진수로 변환한 값을 배열 요소로 사용, temp 배열은 0과 1의 요소로 구성된다.
  • temp의 길이가 n이 안 될 경우, n의 길이를 가질 때까지 앞에 0을 추가해준다.
  • arr[i]에 temp배열 할당 : arr1과 arr2 배열의 요소를 자연수에서 이진법을 나타내는 배열로 바꿔준다.
  • arr1과 arr2는 2차원 배열이 된다.

3. arr1과 arr2 배열에서 벽과 공백인 부분 파악하여 암호 해독

  • arr1과 arr2 배열에서 모두 0인 위치에 해당하는 곳은 answer배열에 공백을,
    그렇지 않은 위치에 해당하는 곳은 answer배열에서 '#' 문자를 넣어준 뒤,
    최종 지도를 얻는다.

🖥️ 코드

function solution(n, arr1, arr2) {
      let answer = Array.from({length: n}, () => "");
  
      for(let i = 0; i < arr1.length; i++) {
          let temp = [...arr1[i].toString(2)];
          if (temp.length < n) {
            while(temp.length !== n) {
              temp.unshift('0');
            }
          }
          arr1[i] = temp;
      }
  
      for(let i = 0; i < arr2.length; i++) {
          let temp = [...arr2[i].toString(2)];
          if (temp.length < n) {
            while(temp.length !== n) {
              temp.unshift('0');
            }
          }
          arr2[i] = temp;
      }

      for (let i = 0; i < n; i++) {
          for (let j = 0; j < n ; j++) {
              if (arr1[i][j] === '0' && arr2[i][j] === '0') answer[i] += ' ';
              else answer[i] += '#';
          }
      }
      return answer;
  }

❗ 다른 사람 풀이(1)

function solution(n, arr1, arr2) {
    var answer = [];
   
    for(let i=0; i<n; i++){
        // toString(2)은 이진수로 반환하는 것.
        const bin = (arr1[i] | arr2[i]).toString(2);
        // console.log(bin);
           let line = [];
        for(let j = bin.length-n; j<bin.length; j++) { // j가(인덱스값)이 -1일 경우 undefined 반환.
            if(bin[j] === '1') { // 1이면 '#', 그 외 ' '
                line.push('#');
            } else {
                line.push(' ');
            }
        }
        answer.push(line.join(''));
    }
    return answer;
}


❗ 다른 사람 풀이(2)

var solution=(n,arr1,arr2)=>arr1.map((a,i)=>(a|arr2[i]).toString(2).padStart(n,0).replace(/0/g,' ').replace(/1/g,'#'))

참고 사이트 바로가기

아... 이거 비트연산자로 해결해야 하는 그런 문제구나...

profile
안녕하세요!

0개의 댓글