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)
- 매개변수 arr1과 arr2의 요소들을 각각 2진수로 나타내고 새로운 배열에 이 값들을 넣는다.
- 2진수로 나타낸 요소를 서로 동일한 인덱스에 위치한 요소끼리 더해서 새로운 배열에 넣는다.
- 이 배열에서 요소 하나씩 반복하면서 0이면 공백으로 바꾸고 그렇지 않으면 #으로 바꾼다.
- 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 |
댓글