본문 바로가기
코테연습

62. 비밀지도 Javascript

by hxunz 2022. 6. 14.

https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 주어진 지도 두개를 겹쳤을때 공백인 부분과 아닌 벽인 부분을 배열로 나타내어라
  • 주어진 자료는 무엇인가?
     - 입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
  • 조건은 무엇인가?
     -
    1 ≦ n ≦ 16
     - arr1, arr2는 길이 n인 정수 배열로 주어진다.
     - 정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.

 

2. 계획

  • 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
     - map
     - 10진수를 2진수로 변환하기 위한 toString(2)

 

  1. 매개변수 arr1과 arr2의 요소들을 각각 2진수로 나타내고 새로운 배열에 이 값들을 넣는다. 
  2. 2진수로 나타낸 요소를 서로 동일한 인덱스에 위치한 요소끼리 더해서 새로운 배열에 넣는다.
  3. 이 배열에서 요소 하나씩 반복하면서 0이면 공백으로 바꾸고 그렇지 않으면 #으로 바꾼다.
  4. 0이 맨 앞인 경우 공백 처리를 한다.

 

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.

 

const solution = (n, arr1, arr2) => {
  const binary1 = arr1.map(it => parseInt(it.toString(2)));
  const binary2 = arr2.map(it => parseInt(it.toString(2)));

  const joinBinary = binary1.map((it, index) => it + binary2[index]);

  const treasureMap = joinBinary.map(it => it.toString().split(''));

  return treasureMap.map((it) => {
    return it.map(num => num === '0' ? ' ' : '#').join('').padStart(n, ' ');
  });
}

test('비밀지도', () => {
  expect(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28])).toEqual(["#####", "# # #", "### #", "#  ##", "#####"])
});

test('맨앞에 숫자가 0일때', () => {
  expect(solution(6, [46, 33, 33 ,22, 31, 50], [27 ,56, 19, 14, 14, 10])).toEqual(["######", "###  #", "##  ##", " #### ", " #####", "### # "])
});

 

4. 반성

  • 문제를 다른 방식으로 해결할 수 있는가?
     - 0이 맨 앞인 경우 공백처리를 할 때, padStart()를 사용했는데 정규표현식을 사용해볼수도 있을것같다.

 

 

문제 설명에 지도 두개를 겹치면 하나의 보물 지도가 완성이 된다는 부분을 읽고 
이 두 배열을 더하면 되겠다는 생각이 들었다.

그래서 10진수로 주어진 배열 숫자들을 2진수로 변환해주고 
이 두 배열 각각 인덱스에 일치하는 2진수 숫자들을 더해주었다.
그리고 0은 무조건 공백이고 1이상은 벽이 된다는 것을 생각해서 예외처리를 해주었다.

그런데 지도를 겹쳤을때 맨 앞부분이 공백이라면 ,,? 리턴할때 맨 앞에 공백을 추가해야된다.
이때 배열의 길이를 나타내주는 n이 생각이 났다. 처음에 n을 왜 알려줬지? 필요없을것같다고 생각했었는데,,,
이걸 사용할 수 있겠구나 싶어서 리턴하는 배열들 중에 n보다 작다면 맨앞이 공백이라는 의미니까
n의 길이에 맞게 맨앞에 공백을 넣어주면 된다.

이렇게 매개변수로 주어진 것들을 잘 살펴봐야겠다.
처음에 joinBinary를 for문으로 나타냈었는데
빈 배열을 만들고 이 배열을 계속 불러오면서 binary1[index] + binary2[index]를 해줬는데
빈 배열을 만들고 이 배열을 계속 불러오면서 -> 이 부분이 불필요하다는 생각이 들어서
map으로 바

'코테연습' 카테고리의 다른 글

65. 두 개 뽑아서 더하기  (0) 2022.06.20
63. 다트 게임  (0) 2022.06.15
61. 최소직사각형 Javascript  (3) 2022.06.14
60.약수의 개수와 덧셈 Javascript  (0) 2022.06.11
59. 예산 Javascript  (0) 2022.06.08

댓글