[프로그래머스] 2018 KAKAO BLIND RECRUITMENT [1차] 비밀지도

HyeRyun·2020년 8월 27일
0

프로그래머스

목록 보기
14/22
post-thumbnail

✔️ 문제

네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.

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

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

😎 소스 코드

function toBinary(n, num) {
  let remains,
    binary = [];
  while (num !== 0) {
    remains = num % 2;
    binary.push(remains);
    num = Math.floor(num / 2);
  }
  binary.reverse();

  // 변환된 2진수를 n자리로 만들어줌
  // n자리보다 클 경우 앞자리 0 삭제
  if (binary.length > n) {
    binary.shift();
  }

  // n자리보다 작을 경우 앞자리에 0 삽입
  if (binary.length < n) {
    while (binary.length !== n) {
      binary.unshift(0);
    }
  }

  return binary;
}

function solution(n, arr1, arr2) {
  let answer = [],
    converted1 = [],
    converted2 = [];

  for (let i = 0; i < n; i++) {
    let string = '';
    converted1 = toBinary(n, arr1[i]);
    converted2 = toBinary(n, arr2[i]);
    for (let j = 0; j < n; j++) {
      if (converted1[j] === 1 || converted2[j] === 1) {
        string += '#';
      } else {
        string += ' ';
      }
    }
    answer.push(string);
  }
  console.log(answer);
  return answer;
}

✊ 문제를 풀고 나서

  • 문제 접근
    1. 배열의 각 숫자를 2진수로 변환: toBinary()에서.
    2. OR연산을 위해 shift(), unshift()를 이용해서 n자리 숫자로 맞춰주는 작업을 함
    3. 2진수로 변환된 배열 두 개 비교 시작
    4. converted1[j] 또는 converted2[j]의 원소 중 하나라도 1이 있으면 string#을 추가해준다. 없으면 빈 공간으로 추가함.
    5. answerstring을 푸쉬해준다.

  • 어려웠던 점
    1. 10진수 -> 2진수 변환에서 시간이 오래 걸렸는데 ㅋㅋ 지금 생각해보면 어이가 없네... 2진수 변환을 위해 num을 2로 나누는 과정을 반복했는데 이상하게 내 예상과 너무 다른 결과가 계속 나왔다. 2진수 변환 과정 로직을 잘못 생각한줄 알고 멘붕이었는데(ㅋㅋ) 알고보니 자바스크립트는 Math.floor()를 이용해야 일반적으로 기대하는 그 값이 나오는거였다.. 이런 ㅠㅠ
    2. 입력값과 내가 작성한 코드의 값이 일치하고 있는지 확인하자. 입력값은 정수 배열인데 뭘 좀 테스트하느라 배열을 지우고 정수값으로 테스트를 했더니 또 이상한 값이 나왔었다..

  • 짧은 소감
    약간의 고충이 있었지만 그래도 재밌게 푼 문제였다!
    문제를 읽어보고 이 정도는 풀 수 있겠다 싶어서 신나게 풀었던 것 같다.
profile
개발개발

0개의 댓글