나의 풀이
처음에는 완전 접근을 잘못했다.
처음 풀었을 때 생각의 흐름
1. dirs길이가 짧고 반복문의 깊이가 깊을 것 같지 않아 forEach를 사용해도 되겠다고 판단했다.
2. 따라서 string을 스프레드 연산자를 통해 배열로 만들고 forEach로 순회하면서 좌표를 저장해야겠다.
3. 좌표는 도착지점만 저장하고 중복이 있으면 안되니 new Set을 사용해서 저장해야겠다.
4. 경계지점 넘어가는 것은 if문을 통해서 제어해야겠다.
5. 이 문제에서 모든 데이터는 string이나 array 보다 object를 사용하는게 더 좋다고 판단했다.
좌표를 [0,0] 이런식으로 할 수도 있지만 좌표는 계속 바뀌고 array를 순회하는 문제도 아니여서 가독성이 떨어지는데 굳이 사용할 필요가 없었다. x좌표를 potin[0]보다 point.x 가 더 가독성이 좋다고 생각했다.
하지만 여기서 고려하지 못한게 있다.
이런식으로 풀면 테스트케이스 2번은 맞지만 1번은 틀리게 된다.
왜냐하면 도착지점의 좌표가 없을때만 answer +=1 이런식으로 체크를 하는데 1번 예제에서는 7번째 명령어를 수행할 때 (0,1) 좌표가 이미 존재해서 answer += 1이 작동하지 않는다.
이 문제는 좌표문제가 아니라 처음걸어본 길의 길이 즉 처음가본 경로를 구해야한다.
이미 도착좌표가 데이터에 있더라도 출발한 좌표가 데이터에 없다면 처음가본 경로이기 때문에 answer +=1을 해줘야한다.
따라서 도착한 좌표가 데이터에 있더라도 출발한 좌표가 데이터에 없으면 answer += 1이다.
이를 고려해서 풀었던게 아래 코드이다.
아예처음부터 출발한좌표와 도착한 좌표를 넣고 여기에 더해 이 둘의 위치를 바꿔서 한 번더 저장해서 한 번의 움직임에 왕복 경로를 모두 담았다. 예를들어서 "U" 명령어가 주어졌다면 (0,0) 에서 출발하고 (0,1) 도착했다면 S00E01 이런식으로 저장하고 그 반대인 S01E00 모두 저장해주었다. 이렇게 저장해준 이유는 왔다가 다시 돌아가는 경우를 제외시키기 위해서이다. 예를들어서 "UUUUUDDDDD" 이라면 전체 걸어본 길이는 '10'이지만 처음 걸어본 길의 길이는 '5'이다.
최종적으로는 왕복경로이기 때문에 처음 걸어본 길의 길이 * 2 이다. 따라서 나누기 2만해주면 정답이 된다.
function solution(dirs) {
let beforeCoordinates = '00';
const visited = new Set();
const splitDirs = [...dirs];
const coordinates = {
x: 0,
y: 0,
};
splitDirs.forEach((dir) => {
if (cannotMove(dir, coordinates)) return;
const nowCoordinates = `${coordinates.x}${coordinates.y}`;
// 왕복 경로 모두 저장 (시작점 S 끝점 E)
visited.add(`S${beforeCoordinates}E${nowCoordinates}`);
visited.add(`S${nowCoordinates}E${beforeCoordinates}`);
beforeCoordinates = nowCoordinates;
});
// 왕복 경로의 개수이기 때문에 나누기 2
return visited.size / 2;
}
function cannotMove(dir, coordinates) {
const move = {
U: 1,
R: 1,
D: -1,
L: -1,
};
if (dir === 'R' || dir === 'L') {
coordinates.x += move[dir];
}
if (dir === 'D' || dir === 'U') {
coordinates.y += move[dir];
}
// 경계선 밖으로 움직일 수 없다.
if (coordinates.y === 6) {
coordinates.y -= 1;
return true;
}
if (coordinates.y === -6) {
coordinates.y += 1;
return true;
}
if (coordinates.x === 6) {
coordinates.x -= 1;
return true;
}
if (coordinates.x === -6) {
coordinates.x += 1;
return true;
}
return false;
}
// 문제
/*
주의 : 경계선 이상 가라고 하는 명령은 무시한다.
처음 걸어본 길만 return 한다.
return number
return 처음걸어본 길 전체
*/
// 설계
/*
어떻게 코드를 만들까?
1) 지나갔던 경로 기억해야함
2) 경계선을 넘는 명령은 무시
*/
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스] level.2 모음사전 (0) | 2023.06.29 |
---|---|
[프로그래머스-JS] level.2 스킬 트리 (0) | 2023.06.28 |
[프로그래머스 - JS,PYTHON] level.3 정수 삼각형 (0) | 2023.06.21 |
[프로그래머스] level.1 기사단원의 무기 ❗️(약수) (0) | 2023.06.19 |
[프로그래머스] level.1 옹알이(2) ⭐️ (0) | 2023.06.19 |