구현.
처음에는 도착한 좌표의 방문처리만 해주면 될 것으로 생각했으나, 도착하는 좌표로 올 수 있는 방법은 4가지나 된다.
그래서 든 생각은
이전 좌표 , 다음 좌표를 해시셋에 저장하는 것이다.
0,0 에서 0,1 로 갔다면 해시셋에
0 0 0 1
을 추가해주면 된다고 생각했다.
그리고 리턴해주는 것은 해시셋의 size로 생각했다.
하지만 이 경우 반례가 있다.
0,0 에서 0,1 로 가고, 그 후 다시
0,1 에서 다시 0,0 으로 온다면
해시셋에는
0 0 0 1
0 1 0 0
2개가 들어가게 된다.
이 경우에 실제로 방문 길이는 1이다.
이 경우를 어떻게 처리해 줄것인가?
생각해보고 내린 결론은 좌표를 오름차순으로 정렬하는 것이다.
0 1 0 0
을 보고, 이전 좌표가 0 1
, 다음 좌표가 0 0
이므로
다음 좌표가 0 0
으로 더 작으므로, 0 1
과 0 0
의 위치를 바꿔서 0 0 0 1
로 바꾼다.
그렇다면 0,0에서 0,1 로 가고, 그 후 0,1 에서 0,0 으로 간것을 모두
0 0 0 1
0 0 0 1
의 방문으로 처리할 수 있고, 이 경우 해시셋의 size는 1이 된다.
import java.util.*;
class Solution {
public int solution(String dirs) {
HashSet<String> set=new HashSet<>();
int nowY=0;
int nowX=0;
int prevY=0;
int prevX=0;
for(int i=0;i<dirs.length();i++){
char ch=dirs.charAt(i);
switch(ch){
case 'U' : nowY--;break;
case 'D' : nowY++;break;
case 'R' : nowX++;break;
case 'L' : nowX--;break;
}
if(nowY<-5||nowX<-5||nowY>5||nowX>5){
nowY=prevY;
nowX=prevX;
continue;
}
int arr[][]={{nowY,nowX},{prevY,prevX}};
Arrays.sort(arr,new Comparator<>(){
@Override
public int compare(int arr1[],int arr2[]){
if(arr1[0]>arr2[0])
return 1;
else if(arr1[0]==arr2[0]){
if(arr1[1]>arr2[1]) return 1;
}
return -1;
}
});
set.add(arr[0][0]+" "+arr[0][1]+" "+arr[1][0]+" "+arr[1][1]);
prevY=nowY;
prevX=nowX;
}
return set.size();
}
}
어려웠다..
1달 전쯤 풀다가 모르겠어서
에이 안해 하고 던져 놓은 문제였는데
오늘에서야 다시 풀었다.
만약에 예제 테스트케이스에서 1번 테스트케이스를 안줬다면
문제가 틀린 원인을 훨씬 오래 고민했을 것 같다.
하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212