🧬알고리즘/Programmers

[JavaScript] [1차] 비밀지도 - 2018 카카오 블라인드 코딩 테스트

뉴발자 2024. 8. 22.
728x90

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[JavaScript] [1차] 비밀지도 - 2018 카카오 블라인드 코딩 테스트

 

 

문제

네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다.

 

그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다.

다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.

 

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

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

 

 

예시

[JavaScript] [1차] 비밀지도 - 2018 카카오 블라인드 코딩 테스트 - 예시

n arr1 arr2 return
5 [9, 20, 28, 18, 11] [30, 1, 21, 17, 28] ['#####', '# # #', '### #', '#  ##', '#####]
6 [46, 33, 33 ,22, 31, 50] [27 ,56, 19, 14, 14, 10] ["######", "### #", "## ##", " #### ", " #####", "### # "]

 

 

나의 풀이

function solution(n, arr1, arr2) {
  const result = arr1
    .map((v, i) => (v | arr2[i]).toString(2))
    .map(v => n > v.length ? "0".repeat(n - v.length) + v : v);
    
  return result.map((v) => v.replaceAll("1", "#").replaceAll("0", " "));
}

 

 

다른 풀이

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

const addZero = (n, s) => {
  return '0'.repeat(n - s.length) + s;
}

 

 

풀이 방법

나의 풀이 방법

arr1과 arr2의 길이는 같기때문에 어떤 배열을 사용해도 상관없다.

 

1. arr1의 각 원소들을 map() 함수를 사용해서 arr1의 index와 일치하는 arr2[index] 값을 가져와 | (OR) 연산을 해준다.

 - OR연산은 두 수를 비교해서 둘 중 하나가 1(참)인 경우 1을 반환해주는 연산이다.

arr1.map((v, i) => (v | arr2[i]));

 

 

2. 연산해서 나온 정수 값을 toString(2) 함수를 사용해서 2진수로 변환해준다.

arr1.map((v, i) => (v | arr2[i]).toString(2));

 

3. 각 원소의 길이를 맞춰주기 위해서 map() 함수를 한번 더 사용해서 n의 길이만큼 앞에 "0"을 붙여준다.

arr1.map((v, i) => (v | arr2[i]).toString(2))
    .map(v => n > v.length ? "0".repeat(n - v.length) + v : v);

 

4. map()과 replaceAll() 함수를 사용해서 문자열의 "1"과 "0"의 값을 각각 "#"과 " "으로 변환해준다.

return result.map((v) => v.replaceAll("1", "#").replaceAll("0", " "));

 

 

다른 풀이 방법

1. 문자열의 길이가 다른 경우 "0"을 붙여주는 함수를 별도로 작성했다.

const addZero = (n, s) => {
  return '0'.repeat(n - s.length) + s;
}

 

2. replaceAll() 대신 replace() 함수와 정규식을 사용해서 값을 변환해줬다.

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

 

 

 

 

 

 

 

 

 

 

728x90

댓글