문제 링크
방문 길이
풀이
- 해당 문제는 좌표를 방문한 지 확인하는 것이 아니라, 이 경로는 이미 방문한 경로인가? 를 확인하는 문제이다.
- 그렇기에 경로를 String 으로 만들고, Set에 넣어 중복되는 경로를 없애면 구할 수 있다.
(0, 0) -> (0, 1)
과 (0, 1) -> (0, 0)
은 결국 방향만 다를 뿐 방문하는 경로 자체는 똑같다.
- 그렇기에 up과 right는 현재좌표 + 이동좌표, down과 left는 이동좌표 + 현재좌표로 기록할 수 있도록 한다.
그렇게 한다면 위에서 예를 들었던 것은 모두 0001
이 나오고, 이를 통해서 우리는 중복되는 경로를 제거할 수 있게된다.
코드
import java.util.HashSet;
import java.util.Set;
class Solution {
public int solution(String dirs) {
int x = 0;
int y = 0;
int[] xPoint = {0, 0, 1, -1};
int[] yPoint = {1, -1, 0, 0};
Set<String> MEM = new HashSet<>();
String[] directions = dirs.split("");
for (String direction : directions) {
int move = move(direction);
int movedX = x + xPoint[move];
int movedY = y + yPoint[move];
if (movedX > 5 || movedX < -5 || movedY > 5 || movedY < -5) {
continue;
}
if(direction.equals("U") || direction.equals("R")){
MEM.add(String.valueOf(x) + y + movedX + movedY);
}
if(direction.equals("D") || direction.equals("L")){
MEM.add(String.valueOf(movedX) + movedY + x + y);
}
x = movedX;
y = movedY;
}
return MEM.size();
}
private int move(String direction) {
switch (direction) {
case "U":
return 0;
case "D":
return 1;
case "R":
return 2;
case "L":
return 3;
default:
throw new IllegalStateException("Unexpected value: " + direction);
}
}
}