[Programmers]-방문 길이
문제
U : 위
D : 아래
R : 오른쪽
L : 왼쪽
순서대로 (0,0)좌표부터 움직여주면 된다. 여기서 캐릭터가 처음 걸어본 길의 길이만 반환해주면 되는 문제이다.
코드
import java.util.*;
class Solution {
int X = 0;//현재 좌표
int Y = 0;
public int solution(String dirs) {
HashSet<Node> set = new HashSet<Node>();
int dirX = 0;//옮긴 좌표
int dirY = 0;
for(int i=0;i<dirs.length();i++){
dirX=X;
dirY=Y;
switch(dirs.charAt(i)){
case 'U' :
if(dirY!=5) dirY++;
break;
case 'D' :
if(dirY!=-5) dirY--;
break;
case 'R' :
if(dirX!=5) dirX++;
break;
case 'L' :
if(dirX!=-5) dirX--;
break;
}
if(X!=dirX || Y!=dirY){//바뀐좌표가 그대로면
if(!set.contains(new Node(dirX, dirY, X, Y))){//반대에서 오는 방향이 없으면
set.add(new Node(X, Y, dirX, dirY));
}
}
X = dirX;
Y = dirY;
}
return set.size();
}
public class Node{
int x;
int y;
int mx;
int my;
public Node(int x, int y, int mx, int my){//생성자
this.x = x;
this.y = y;
this.mx = mx;
this.my = my;
}
@Override
public int hashCode(){
return (""+this.x+this.y+this.mx+this.my).hashCode();
}
@Override
public boolean equals(Object obj){
if(obj instanceof Node){
Node k = (Node)obj;
return this.hashCode() == k.hashCode();
}
return false;
}
}
}
코드 설명
중복을 없애기 위해 hashset을 이용했다. x,y와 옮겨진 좌표 dirX, dirY를 set에 넣어주고싶어서
Node 클래스를 새로 만들었다. 그뒤에 생성자를 이용해 객체를 넣어줬다. 그런데 여기서 set이 중복값도 받아버리는 상황이 발생했다. 이유를 살펴보니 객체를 계속 새롭게 받아주고
set에 새로운 주소값이 들어가버리기 때문이다. hashset과 관련된 hashCode()와 equals()를 오버라이딩 해주면 된다. 이 부분은 새로 포스팅해야겠다.
나머지는 주석처리 했다.
요약
- instanceof와 Override
- 괄호에는 스택을 써주면 편하다.