난이도: Lv. 2
문제: https://school.programmers.co.kr/learn/courses/30/lessons/49994
알고리즘
1. 어느 좌표에서 어느 좌표로 이동했는지를 저장할 Set을 선언한다.
2. 이전 좌표를 저장하는 배열과 현재 좌표를 저장하는 배열을 모두 [0, 0]으로 초기화한다.
3. 이동할 방향의 좌표가 좌표평면의 경계를 넘어가지 않는다면 이동한다. 이동했을 경우 이전좌표와 이동한 현재좌표 순으로 문자열로 바꿔 Set에 추가하고, 현재좌표와 이전좌표 순으로 문자열로 바꾼 것도 Set에 저장한다. 처음 걸어본 길인가를 판단하는 문제이기 때문에 방향은 중요하지 않기 때문이다. 둘 다 Set에 추가한 후 이전 좌표를 현재 좌표로 업데이트한다.
4. 파라미터로 주어진 문자열대로 모두 이동했으면 Set 길이의 절반을 반환한다. 절반으로 나누는 이유는 동일한 길을 다른 방향으로 두 번 지나는 경우를 모두 저장했기 때문이다.
코드
function solution(dirs) {
const mapSize = 5;
let prePos = [0, 0];
const currPos = [0, 0];
const set = new Set();
for (let i = 0; i < dirs.length; i++) {
let isMoving = false;
switch (dirs[i]) {
case 'U':
if (currPos[1] < mapSize) { currPos[1]++; isMoving = true; }
break;
case 'D':
if (currPos[1] > -mapSize) { currPos[1]--; isMoving = true; }
break;
case 'L':
if (currPos[0] > -mapSize) { currPos[0]--; isMoving = true; }
break;
case 'R':
if (currPos[0] < mapSize) { currPos[0]++; isMoving = true; }
break;
}
if (isMoving) {
set.add(prePos[0].toString() + prePos[1].toString() + currPos[0].toString() + currPos[1].toString());
set.add(currPos[0].toString() + currPos[1].toString() + prePos[0].toString() + prePos[1].toString());
prePos = [...currPos];
}
}
return Array.from(set).length / 2;
}
주저리
처음 할 때는 아무 생각 없이 현재 좌표만 저장하다가 이게 아님을 깨닫고 고쳤는데 금방 통과했다. 정답률이 왜 50%대인지 의문인 문제 이긴 하다.
'코딩테스트' 카테고리의 다른 글
[JS] 땅따먹기 (0) | 2024.01.09 |
---|---|
[JS] 주식 가격 (0) | 2024.01.08 |
[JS] 뒤에 있는 큰 수 찾기 (0) | 2024.01.04 |
[JS] 주차 요금 계산 (0) | 2024.01.03 |
[JS] 더 맵게 (0) | 2024.01.03 |