<문제>
https://school.programmers.co.kr/learn/courses/30/lessons/49994
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
< 풀이 >
function changeLocation(x,y,dir){
switch(dir){
case 'U':
return [x,y+1];
case 'D':
return [x,y-1];
case 'R':
return [x+1,y];
case 'L':
return [x-1,y];
}
}
function solution(dirs) {
var answer = 0;
let visited = new Set();
let x=0;
let y=0;
for(let i=0;i<dirs.length;i++){
const [nx,ny] = changeLocation(x,y,dirs[i]);
if(nx<-5 || nx>5 || ny<-5|| ny>5)
continue;
visited.add(`${x}${y}${nx}${ny}`);
visited.add(`${nx}${ny}${x}${y}`);
x=nx;
y=ny;
}
answer = visited.size/2;
return answer;
}
✏️ 풀이 방법
1. 해당하는 문자에 따라 좌표 방향을 지정해주는 changeLocation 함수를 정의한다.
2. 방문한 곳을 저장하기 위해 visited 변수를 set 으로 정의한다. (중복되지 않게 하기 위함)
3. dirs 를 반복문을 돌면서, changeLocation 함수를 통해 nx 와 ny 에 이동한 좌표의 값을 저장한다.
3-1. 이동한 좌표가 좌표평면의 경계를 넘어갈 경우에는 다음 반복문으로 넘어간다.(명령어 무시)
3-2. 경계를 넘어가지 않을 경우에는 visited 에 이동한 경로를 저장한다.(방향성이 없기 때문에 x,y => nx,ny / nx,ny => x,y 두 경우 모두를 저장한다.)
3-3. 이동을 했으므로 x와 y 좌표의 값을 nx 와 ny 로 변경한다.
4. visited 에는 중복되지 않은 경로가 저장이 된다. 경로는 같지만 방향이 다른 2가지 경우를 모두 저장했으므로 최종 답은 visited.size/2 한 값이 정답(처음 걸어본 길의 길이) 이 된다.
✍🏻 느낀점
처음에 set 을 사용하는 것까지는 생각했지만, 중복되는 지점을 어떻게 계산할 것인지 그리고 set 에 배열을 저장하는 식으로 문제를 풀어서 set 이 내가 원하는대로 동작하지 않았다. 이번 문제를 통해 처음 알게 된 것인데, set 에 객체를 넣게 될 경우에는 중복 체크가 제대로 되지 않는다고 한다. 이 이유는 자바스크립트의 객체는 참조 타입이므로 원시 타입과 다르게 비교할 때 값이 아닌 메모리 주소를 따지기 때문이다. 문제 자체는 이해하는 데 어렵지 않았는데 사소한 부분들 하나 하나 때문에 막혔던 것 같다. 이번 문제를 통해 변수를 문자열 식으로 변환해서 set 에 어떻게 저장하는지도 배웠으니 다음에 비슷한 문제가 나오면 이를 잘 활용해봐야겠다.
'코딩테스트 > Programmers' 카테고리의 다른 글
[JS] 수식 최대화 (0) | 2024.12.30 |
---|---|
[JS] PCCP 기출문제 2번 / 퍼즐 게임 챌린지 (1) | 2024.12.15 |
[JS] PCCP 모의고사 #2 1번 - 실습용 로봇 (1) | 2024.12.08 |
[JAVA] 숫자 문자열과 영단어 (0) | 2024.06.14 |
[JAVA] 이웃한 칸 (1) | 2024.06.10 |