처음 문제를 풀면서 -5~5 사이 좌표값을 가지면 되겠다 생각을 했었다. 그래서 5와 -5를 벗어나는 이동은 계산하지 않으면서 풀었었다.
-5와 5사이의 X,Y 좌표를 가져야 한다. 따라서 넘어가는 경로는 고려되지 않아야 함
if(nextX > 5 || nextX < -5 || nextY > 5 || nextY < -5) continue;
중복된 경로를 어떻게 연산하지 않을지는 가장 힘든 부분이었고 여러 블로그를 찾아보기도 하였다. 그리고 U 와 D
L 과 R
을 연산할때 서로 서로 반대 방향
으로 저장하면 같은 경로 다른 방향에서도 같은 경로로 취급하기 때문에 옳바른 값을 도출 해 낼 수 있었다.
case 'U': nextY++; road += nowX; road += nowY; road += nextX; road += nextY; break; case 'D': nextY--; road += nextX; road += nextY; road += nowX; road += nowY; break; case 'R': nextX++; road += nowX; road += nowY; road += nextX; road += nextY; break; case 'L': nextX--; road += nextX; road += nextY; road += nowX; road += nowY; break;
U와 R
은 현재 좌표부터 D와 L
은 다음 좌표부터 저장함으로써 반대방향으로 같은 경로를 구분할 수 있다.
import java.util.*;
class Solution {
public int solution(String dirs) {
//Set : 중복 허용 안함 -> 경로 중복 제거
Set<String> s = new HashSet<String>();
int nowX = 0;
int nowY = 0;
int nextX;
int nextY;
// U와R는 now -> next로 이동
// D와L는 next -> now로 이동
// 상반되는 방향성을 반영
for(int i = 0; i < dirs.length(); i++){
nextX = nowX;
nextY = nowY;
String road = "";
switch(dirs.charAt(i)){
case 'U': //nowX nowY nextX nextY
nextY++;
road += nowX;
road += nowY;
road += nextX;
road += nextY;
break;
case 'D': //nextX nextY nowX nowY
nextY--;
road += nextX;
road += nextY;
road += nowX;
road += nowY;
break;
case 'R': //nowX nowY nextX nextY
nextX++;
road += nowX;
road += nowY;
road += nextX;
road += nextY;
break;
case 'L': //nextX nextY nowX nowY
nextX--;
road += nextX;
road += nextY;
road += nowX;
road += nowY;
break;
}
// -5 ~ 5사이에서만 이동 가능
if(nextX > 5 || nextX < -5 || nextY > 5 || nextY < -5)
continue;
//현재 이동 경로 저장
s.add(road);
//다음 위치로
nowX = nextX;
nowY = nextY;
}
//Set에는 중복 경로가 없음
return s.size();
}
}
https://excited-hyun.tistory.com/192