https://school.programmers.co.kr/learn/courses/30/lessons/49994
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[나의 코드]
const solution = (dirs)=>{
let currentPoint=[0,0]; // 현재 좌표
let routes=[[[0,0],[0,0]]] // 전체 경로
const max = 5 // 상하좌우 최대값
const min = -5// 상하좌우 최소값
const checkRouteLength = (number)=>{
let count = number-1 // 초기값을 [[0,0],[0,0]]으로 세팅했기 때문에 이동하지 않았음에도 길이값이 1 => -1 해줌
for(i=0;i<routes.length;i++){
let [start1,end1] = routes[i]
for(j=i;j<routes.length;j++){
let [start2,end2]=routes[j]
if(i!==j){
// 이동 경로가 같을 수 있는 케이스들의 경우 count에서 1을 빼주고 break
if([start1,end1].toString()==[start2,end2].toString()||
[start1,end1].toString()==[end2,start2].toString()
){
count --
break;
}
}
}
}
return count
}
for(i=0;i<dirs.length;i++){
const direction = dirs[i]
let x = currentPoint[0]
let y = currentPoint[1]
switch(direction){
case "U": y++; break;
case "D": y--; break;
case "L": x--; break;
case "R": x++; break;
}
if(x>=min&&x<=max&&y>=min&&y<=max){
routes.push([currentPoint,[x,y]])//[[이전 좌표],[현재 좌표]]
currentPoint=[x,y] // 현재 좌표 갱신
}
}
return checkRouteLength(routes.length)
}
처음에는 쉽게 생각했는데 의외로 풀고 리팩토링까지 하는데 네 시간 넘게 걸렸음...
몇가지 생각지 못한 몇가지 복병들이 있었는데 기록해보자면 아래와 같다
1. 단순히 현재 좌표만을 계산하면 되는것이 아니라 이동한 경로에 대해서 기록을 하고 있어야 한다.
오 쉽네~'라고 생각하고 채점을 돌렸다가 답이 하나 틀려서 왜인지 로그를 찍어보니 "내가 한번도 도달하지 못한 좌표인가"가 중요한게 아니라 이전에 들렸던 지점에 도달하더라도 이동한 경로가 겹치지 않으면 각기 따로 계산을 해줬어야 했다. routes에 이전의 경로값과 현재의 값을 같이 저장하는 것을 구현하는데 시간이 오래 걸렸다.
2. [1,2]!==[1,2]
예전에 얼핏 들어본 적은 있었지만, 이 부분을 놓쳐서 또 깨나 오랜시간 삽질을 했다. 배열의 원소가 같다고 해도 두 배열이 같은 것은 아니다. 비교를 하기 위해 toString()으로 문자열로 변화시킨 후 확인하였다.
3. 이동경로 중첩 제대로 코너케이스
1,2까지 생각하고 문제를 풀고 채점을 돌리니 20케이스 중에서 7개의 케이스는 통과가 뜨고 나머지 13개의 케이스에 대해서는 통과가 뜨지 않았다. 내가 생각하지 못한 코너케이스가 뭐가 있을까 여러가지 방면으로 생각을 하다가 checkRouteLength 함수에서 경로가 같은지 확인을 할 때 처음에는 [start1,end1].toString()==[start2,end2].toString() <= 만을 생각해 완전히 경로의 방향까지 완전히 일치하는 케이스만을 고려하고 있음을 알게 되었다. [[1,1],[2,2]]와 [[2,2],[1,1]]는 이 상황에서는 같은 이동경로를 가진다. 추가적인 케이스를 더 작성해주고 나서야 20개 케이스를 완전히 통과할 수 있었다...(하얗게 불태웠음...)
'알고리즘' 카테고리의 다른 글
프로그래머스 > 해시 > 위장 (0) | 2023.04.07 |
---|---|
프로그래머스 > 2019 KAKAO BLIND RECRUITMENT > 오픈채팅방 (0) | 2023.04.04 |
프로그래머스 > 카카오 개발자 겨울 인턴십 > 튜플 (0) | 2023.04.01 |
프로그래머스 > 완전 탐색 > 소수 찾기 (0) | 2023.03.31 |
자바스크립트 문자열 문제풀이 (0) | 2023.03.24 |