Programmers - 2018 KAKAO BLIND RECRUITMENT [1차] 비밀지도

So'sCode·2021년 11월 13일
0

프로그래머스 - Lv1.

목록 보기
4/20
post-thumbnail

문제 설명📖

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

  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) {
    var answer = [];
    for(let i = 0;i<n;i++){
        answer[i] = (arr1[i] | arr2[i]).toString(2);
        while(answer[i].length < n) 
            answer[i] = '0'+answer[i];
        answer[i] = answer[i].toString().replace(/1/g,'#').replace(/0/g,' ');
    }
    return answer;
} 

정리(알게된 점)📚

✨ 비트 연산자
기호 : & , 문법 : a & 3 , 의미 : a와 3의 비트 논리곱 연산
기호 : | , 문법 : a | 3 , 의미 : a와 3의 비트 논리합 연산
기호 : ^ , 문법 : a ^ 3 , 의미 : a와 3의 배타적 논리합 연산
기호 : >> , 문법 : a >> 3 , 의미 : a의 비트열을 오른쪽으로 3칸 이동
기호 : << , 문법 : a << 3 , 의미 : a의 비트열을 왼쪽으로 3칸 이동

✨ .toString()

  • 문자열을 반환하는 object의 대표적인 방법
  • 기수를 이용함으로써 10진수를 (1, 2, 3, 4, 5...) 다른 진수로 변환할 수 있습니다.
ex. let baseTenInt = 10;
  console.log(baseTenInt.toString(2));
  // "1010"이 출력됩니다

✨ .replace()

  • 치환한다는 의미
    g : 모든 패턴 체크(global)
    i : 대소문자를 구별없이 체크
    m : 여러줄 체크
    .replace(' ','') : 첫번째 공백 제거
    .replace(/-/g,'') : - 제거
    .replace(/[-]/g,'')
    .replace(/,/g,'') : , 제거
    .replace(/^\s+/,'') : 앞의 공백 제거
    .replace(/\s+/,):뒤의공백제거.replace(/\s+\s+/,'') : 뒤의 공백 제거 .replace(/^\s+|\s+/g,'') : 앞뒤 공백 제거
    .replace(/\s/g,'') : 문자열 내의 모든 공백 제거
    2가지 이상사용시 .replace(/[-]|\s/gi, ''); 등으로 |(or)을 가지고 사용가능 (-,공백제거)
    출처 : replace 및 정규 공식

처음에 if else 를 사용해서 풀어보려고 했지만, 카카오가 이 문제에서 요구하는것은 바로 비트 연산을 사용해서 푸는거 였다. 처음에 풀었을 때

while(answer[i].length < n) 
            answer[i] = '0'+answer[i];
           

이 구간을 빼놓고 작성해서 두번째 예제 조건에 충족하지 못하였다.
이구간을 사용해야하는 이유는 입력한 n과 답의 길이가 같지 않다면 앞에 한칸 띄어쓰기를 입력해야한다.

profile
이왕하는거미루지말고하자.

0개의 댓글