-
[CodeKata] 프로그래머스 : 3.8(월), 방문 길이Algorithm 2021. 3. 8. 16:44반응형
🥋 Ooooth!! (Level 2)
🧮 풀이
function solution(dirs) { let position = [0,0]; let count = 0; let vectorArr = []; const move = { U: (arr) => arr[1] === 5 ? arr : [arr[0], arr[1]++], D: (arr) => arr[1] === -5 ? arr : [arr[0], arr[1]--], R: (arr) => arr[0] === 5 ? arr : [arr[0]++, arr[1]], L: (arr) => arr[0] === -5 ? arr : [arr[0]--, arr[1]], } for (let l of dirs) { const vector = [position, move[l](position)].sort() const vectorS = vector.map(e => `(${e[0]},${e[1]})`).join(' to ') if (!vectorArr.includes(vectorS) && vector[0] !== vector[1] ) { vectorArr.push(vectorS); count++ } } return count; }
- position은 현재 위치이다. vectorArr는 이동한 경로를 저장, count는 반환할 정답이자 이동하지 않은 경로를 센 숫자다.
- move는 4가지의 dirs 값에 따라 position을 이동시키는 함수가 담겨있는 객체이다. move[dirs 값](position) 형식으로 적용한다.
- dirs를 순회하며 vector 튜플을 만든다. 기존 및 move로 이동한 position이 담기며, 반대경로도 통일될 수 있도록 sort 처리한다.
- vectorS를 새로 만드는 이유는, vector 배열은 같은 배열이라도 새로운 이터러블 객체로 인식하기에 다른 객체가 되기 때문이다.
- 조건문에는 vectorS로 경로 중복비교와, vector 전후위치가 같은지(같다면 끝좌표라 이동하지 않음) 2가지 조건이 들어있다.
- 위 조건에 부합하지 않으면, 새로운 경로를 이동했다는 의미로 vectorArr에 경로저장 및 count에 1을 더해준다.
🖇 리뷰
대부분 Switch 문을 통한 상하좌우 이동했고, 그 뒤 iterable 배열들을 순회해서 비교하는 것이 일반적이었다.
move 함수객체를 사용한 점, 그리고 string화 해서 이터러블을 비교한 점 두 가지가 나름 뿌듯한 오늘의 성과이다.
반응형'Algorithm' 카테고리의 다른 글
[CodeKata] 프로그래머스 : 3.10(수), 이진 변환 반복하기 (0) 2021.03.10 [CodeKata] 프로그래머스 : 3.9(화), 숫자의 표현 (0) 2021.03.09 [CodeKata] 프로그래머스 : 3.7(일), 게임 맵 최단거리 (0) 2021.03.07 [CodeKata] 프로그래머스 : 3.4(목), 다음 큰 숫자 (0) 2021.03.04 [CodeKata] 프로그래머스 : 3.3(수), 올바른 괄호 & 튜플 (0) 2021.03.03