[프로그래머스] 레벨3 (level3) 방문 길이
2020년 06월 24일, 11:00
방문 길이
문제설명
게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.
U: 위쪽으로 한 칸 가기
D: 아래쪽으로 한 칸 가기
R: 오른쪽으로 한 칸 가기
L: 왼쪽으로 한 칸 가기
캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다.
좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.예를 들어, ULURRDLLU로 명령했다면
1번 명령어부터 7번 명령어까지 다음과 같이 움직입니다.
![]()
8번 명령어부터 9번 명령어까지 다음과 같이 움직입니다.
![]()
이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다. 예를 들어 위의 예시에서 게임 캐릭터가 움직인 길이는 9이지만, 캐릭터가 처음 걸어본 길의 길이는 7이 > 됩니다. (8, 9번 명령어에서 움직인 길은 2, 3번 명령어에서 이미 거쳐 간 길입니다)
단, 좌표평면의 경계를 넘어가는 명령어는 무시합니다.
예를 들어, LULLLLLLU로 명령했다면
1번 명령어부터 6번 명령어대로 움직인 후, 7, 8번 명령어는 무시합니다. 다시 9번 명령어대로 움직입니다.
![]()
이때 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다.
명령어가 매개변수 dirs로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return 하는 solution 함수를 완성해 주세요.
제한사항
- dirs는 string형으로 주어지며, 'U', 'D', 'R', 'L' 이외에 문자는 주어지지 않습니다.
- dirs의 길이는 500 이하의 자연수입니다.
입출력 예
dirs answer ULURRDLLU 7 LULLLLLLU 7 입출력 예 설명
입출력 예 #1
문제의 예시와 같습니다.입출력 예 #2
문제의 예시와 같습니다.
문제풀이
- 2차원 배열을 11의 크기만큼 만듦(-5,5까지 좌표를 표시하기 위해).
- visited Set을 만듦.(나중에 중복을 검사하기 위해서.)
- [5, 5]부터 시작.
- dirs의 길이만큼 for문을 돌림.
- dx, dy를 선언하고,
- start의 각각 0,1 인덱스에 더하고 뺀 값이 0보다 작거나 11보다 크면 continue.(좌표를 벗어남.)
- visited에 문자열로 방문한 좌표를 넣어줌(양방향이 가능하므로 0011 1100 으로 두 개를 넣어줌.)
- answer은 visited의 size의 반.
function solution(dirs) {
var answer = 0;
let arr = Array(11).fill(0);
arr = arr.map(e => Array(11).fill(0));
let visited = new Set();
let start = [5, 5];
for (let i = 0; i < dirs.length; i++) {
let [dx, dy] = move(dirs[i]);
if (
start[0] + dx < 0 ||
start[0] + dx >= 11 ||
start[1] + dy < 0 ||
start[1] + dy >= 11
)
continue;
let before = [start[0], start[1]];
start[0] += dx;
start[1] += dy;
visited.add(`${before[0]}${before[1]}${start[0]}${start[1]}`);
visited.add(`${start[0]}${start[1]}${before[0]}${before[1]}`);
}
answer = visited.size / 2;
return answer;
}
function move(command) {
switch (command) {
case "U":
return [0, 1];
case "D":
return [0, -1];
case "R":
return [1, 0];
case "L":
return [-1, 0];
default:
return [0, 0];
}
}
여담
친구가 알려준 문제를 풀어보고, 그 문제랑 비슷한 문제여서 쉽게 풀었음.
진짜 문제를 많이 풀어봐야 한다는 것을 다시 느낀 문제.