본문 바로가기
Developer/Algorithm

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

by 김씩씩 2020. 9. 13.

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

 

Programmers(프로그래머스)의 코딩테스트 연습문제 Level 1 중 2018 KAKAO BLIND RECRUITMENT 문제인 [1차] 비밀지도 문제를 JavaScript를 사용하여 문제를 풀어보도록 하겠습니다.

문제 설명

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

  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을 만족한다.

 

출력 형식

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

 

입출력 예제

매개변수
n 5
arr1 [9, 20, 28, 18, 11]
arr2 [30, 1, 21, 17, 28]
출력 ["#####","# # #", "### #", "# ##", "#####"]

 

매개변수
n 6
arr1 [46, 33, 33 ,22, 31, 50]
arr2 [27 ,56, 19, 14, 14, 10]
출력 ["######", "### #", "## ##", " #### ", " #####", "### # "]

 

 

작성한 답

solution.js

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

 

설명

문제를 제대로 읽어보기도 전에 문제의 사진만 보고 바로 해결이 가능하겠다 싶은 문제였습니다.

2진수를 비트 OR 연산만 해주면 바로 해결될 문제라고 바로 떠올랐습니다.

비트 OR 연산자는 연산자 양쪽의 피연산자의 이진 표현을 OR 연산 시켜줍니다.

예를들어 9 | 30 은 9의 2진수인 01001과 30의 2진수인 11110₂의 OR 연산으로 11111로 만들어 11111의 10진수 값인 31을 반환시켜줍니다.

이말은 즉, 이 OR 연산자를 떠올려 주셨으면 달리 처리 해줄것이 크게 없다는 말과 같습니다.

map() 함수를 사용하여 arr1의 배열을 돌면서 각 요소의 값과, 배열 arr2의 같은 index 값을 OR연산자로 계산해주고 해당 값을 toString(2)을 사용해 2진수로 변경시켜 줍니다.

그리고 그 2진수로 변경시켜준 값은 맨 앞자리가 0일 경우 생략되기 때문에 padStart(n,'0')를 사용해 문자열의 길이가 한변의 길이이자 각 요소들을 2진수로 변경했을 때 나올 수 있는 최대의 길이인 n이 되도록 앞에서 '0'을 채워줍니다.

그리고 replace()를 통해 '1'일때는 '#', '0'일때는 ' ' 로 공백을 줍니다.

JavaScript에서 replace를 할때 '1'과 '0'을 둘 다 매칭시키도록 정규식을 사용하여 /1|0/ 를 쓰고 문자열 안에 모든 '1'과 '0'을 매칭시킬 수 있도록 g 플래그를 사용해줍니다.

그리고 변경할 문자는 '1'일때는 '#', '0'일때는 ' ' 로 공백으로 변경해줘야 하므로, 매칭된 '1' 혹은 '0'을 숫자화 연산자인 +를 붙여 숫자로 만들었을 때, 1은 true로 볼 수 있으므로 삼항연산자를 통해 '#'을, 0은 false로 볼 수 있으므로 ' ' 공백을 return 하여 문자열을 변경시켜주면 됩니다.

그렇게 모든 요소들이 변경된 값을 return 하면 문제를 해결하실 수 있습니다.

 

 

제가 틀린 부분이 있다거나 더 좋은 방법을 아시는 분이 계시다면 댓글로 공유 부탁드립니다!

 

 

도움이 되셨다면 공감, 댓글 부탁드립니다!

궁금하신 점이나 요청 사항은 언제든지 말씀 해주세요!

 

감사합니다.


댓글