게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.
U: 위쪽으로 한 칸 가기
D: 아래쪽으로 한 칸 가기
R: 오른쪽으로 한 칸 가기
L: 왼쪽으로 한 칸 가기
캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.
예를 들어, "ULURRDLLU"로 명령했다면
이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다. 예를 들어 위의 예시에서 게임 캐릭터가 움직인 길이는 9이지만, 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다. (8, 9번 명령어에서 움직인 길은 2, 3번 명령어에서 이미 거쳐 간 길입니다)
단, 좌표평면의 경계를 넘어가는 명령어는 무시합니다.
예를 들어, "LULLLLLLU"로 명령했다면
이때 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다.
명령어가 매개변수 dirs로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return 하는 solution 함수를 완성해 주세요
제한사항
import java.util.*;
class Solution {
public int solution(String dirs) {
int answer = 0;
HashSet<String> set = new HashSet<>();
char[] dir = dirs.toCharArray();
int x = 0;
int y = 0;
for(int i=0; i<dir.length; i++) {
int pX = x;
int pY = y;
if(dir[i] == 'U' && y < 5) {
y += 1;
}
else if(dir[i] == 'D' && y > -5) {
y-=1;
}
else if(dir[i] == 'R' && x < 5) {
x+=1;
}
else if(dir[i] == 'L' && x > -5) {
x-=1;
}
if(pX == x && pY == y) {
continue;
}
set.add("" + pX + pY + x + y);
set.add("" + x + y + pX + pY);
}
answer = set.size()/2;
return answer;
}
}
HashSet을 사용하여 선분을 나타내는 String을 set에 추가하여 구하는 방식을 사용했다!
처음에는 pX, pY (한칸 옮기기전 위치) 와 x, y (옮긴 후 위치)를 String으로 만들어서 set에 저장하였다. set은 중복을 알아서 처리해주니까 set의 size를 구하면 결과 값이 나올 것이라고 생각하였다.
하지만 테스트 실패가 ... 😥
그래서 질문하기에서 힌트를 얻으려다가 생각하지 못한 예외를 발견했다👍🏻
예를 들어 "UDU"인 경우 (0,0)부터 시작하니까 (0,1) -> (0,0) -> (0,1)로 가게 되는데 가는 경로와 되돌아 오는 경로가 같으니까 처음 걸어본 길의 거리가 1이 되는 것이다!
그러면 어떻게 해결하는게 좋을까 고민해 보다 양방향으로 set에 추가하는걸로 해결 방안을 찾았다
set.add("" + pX + pY + x + y);
set.add("" + x + y + pX + pY);
이렇게 양방향으로 set에 추가하면 가는 경로와 되돌아 오는 경로를 같은 경로로 취급하게 된다! 그래서 결과 값 answer을 구할때만 size에서 2를 나눠주면 된다.
if(pX == x && pY == y) {
continue;
}
이 코드는 자리 이동이 없을 때는 set에 추가하지 않고 건너뛰는걸 말한다