https://programmers.co.kr/learn/courses/30/lessons/17681
코딩테스트 연습 - [1차] 비밀지도
비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다
programmers.co.kr
네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
- 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
- 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다.
지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.- "지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
- 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.
function solution(n, arr1, arr2) {
let array1 = [];
let array2 = [];
let array3 = [];
console.log(array1)
for(let i = 0; i < n; ++i) {
array1.push(arr1[i].toString(2).padStart(n,"0"))
array2.push(arr2[i].toString(2).padStart(n,"0"))
}
console.log(array1, array2)
let temp = "";
for(let i = 0; i < n; ++i) {
for(let j = 0; j < n; ++j) {
if(array1[i][j]==="0"&&array2[i][j]==="0") {
temp += " ";
} else temp += "#"
}
array3.push(temp);
temp = "";
}
console.log(array3)
return array3;
}
solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28])
처음 문제 보고 뭐야,,, 싶었는데 처음 떠올린 해결 방안으로 한 번에 풀었다!
아직 쉬운 문제겠지만... 그래도 예전에 완전 기초 문제도 못 풀던 거 생각하면 완전 뿌듯하다 🫶
아직 메서드로 푸는 방법은 생각도... 안 나지만 지금 너무 뿌듯해!
1. 받은 지도 두 개를 2진수로 풀어낸다. 자리수에 못 미치면 그 부분은 padStart를 이용해 "0"으로 메꾼다.
2. 풀어낸 지도를 새 배열에 push로 담는다. 여기선 new Array를 해서 그 자리에 굳이 넣어줄 필요없이 순서대로 들어가기만 하면 돼서 push로 담았다.
3. 배열의 한 줄, 그리고 그 안에 문자열 하나하나에 접근해야해서 이중포문을 사용했다. array1과 array2의 한 줄의 한 글자씩 가져와서 둘 다 0이면 벽이 아니기에 " "를 더해주고, 그게 아닌 모든 경우의 수는 벽이기 때문에 "#"을 더해준다.
* 여기서 push가 아닌 이유는 array1, array2의 형태(문자열이 5개 들어가있는 형태)처럼 만들기 위해서다. 정확히는 반환해야 하는 형식에 맞추기 위해서 문자열안에 더해주고, 한 줄이 완성 될때마다 그 문자열을 push하는 형식으로 했다.
4. 그럼 완성된 array3을 return 해주면 된다~~~!
멘토님 메서드 이용한 풀이법!
function solution(n, arr1, arr2) {
return arr1.map((map1, i)=> {
// console.log(map1, arr2[i])
map1 = map1.toString(2).padStart(n, "0");
const map2 = arr2[i].toString(2).padStart(n, "0");
return map1.split("").reduce((acc,cur, j)=> {
// console.log(acc, cur, map1, map2[j])
return acc + (cur === "1" || map2[j]==="1" ? "#" : " ")
},"")
// 문자열 쪼개서 배열로 만들기
// 리듀스의 결과를 배열로 묶어서 리턴한다.
// 와 신기하당
console.log(map1, map2);
})
// 크기가 같아서 인덱스 값을 공유할 수 있다.
}
solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28])
reduce안에서 (acc,cur) => acc+cur 은 화살표 함수 + 한 줄 일 때 return을 생략할 수 있기 때문에 저렇게 쓸 수 있는 것이고, { } 중괄호를 쓰면 return을 명시적으로 써줘야 한다.
acc(누적값)에 cur을 더하고 다음 반복문으로 넘기고...를 반복하는데 여기서 return이 없으면 acc가 undefined로 나온다!
map이랑 reduce 안에서 저렇게 많은 일이 일어나도 되는건가? 싶어서 볼때마다 신기하다... 나도 언젠가 메서드로 풀 수 있길,,,!
'프론트엔드✏️ > 코드캠프' 카테고리의 다른 글
SPA(Single Page Application) & MPA(Multi Page Application) (0) | 2022.06.28 |
---|---|
220627 프론트엔드 부트캠프 48일차 : 배포를 해보자!(1), 테스트 코드(jest), 리액트 네이티브 (0) | 2022.06.27 |
220624 프론트엔드 부트캠프 45일차 🌺기말고사🌺 파이팅🫶 (0) | 2022.06.24 |
220623 프론트엔드 부트캠프 44일차 : optimistic ui, og, SSR (0) | 2022.06.23 |
[문제...] react-hook-form, 엔터치면 뮤테이션이 날아감 (0) | 2022.06.23 |