티스토리 뷰

728x90

문제링크

 

문제 설명


게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.

  • U: 위쪽으로 한 칸 가기
  • D: 아래쪽으로 한 칸 가기
  • R: 오른쪽으로 한 칸 가기
  • L: 왼쪽으로 한 칸 가기

 

캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.

 

 

예를 들어, "ULURRDLLU"로 명령했다면

 

 

  • 1번 명령어부터 7번 명령어까지 다음과 같이 움직입니다.

 

 

  • 8번 명령어부터 9번 명령어까지 다음과 같이 움직입니다.

 

 

 

이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다. 예를 들어 위의 예시에서 게임 캐릭터가 움직인 길이는 9이지만, 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다. (8, 9번 명령어에서 움직인 길은 2, 3번 명령어에서 이미 거쳐 간 길입니다)

단, 좌표평면의 경계를 넘어가는 명령어는 무시합니다.

예를 들어, "LULLLLLLU"로 명령했다면

 

 

  • 1번 명령어부터 6번 명령어대로 움직인 후, 7, 8번 명령어는 무시합니다. 다시 9번 명령어대로 움직입니다.

 

 

이때 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다.

명령어가 매개변수 dirs로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return 하는 solution 함수를 완성해 주세요.

 

제한사항

  • dirs는 string형으로 주어지며, 'U', 'D', 'R', 'L' 이외에 문자는 주어지지 않습니다.
  • dirs의 길이는 500 이하의 자연수입니다.

입출력 예

 

문제 풀이 과정


이 문제를 처음 접근 했을 때는 이동한 좌표를 모두 HashSet 에 넣으면 중복이 제거 되겠구나 싶어서 HashSet 을 이용하여 코드를 작성하였다.

이때 중복이 제대로 제거가 안되어 Hashcode 를 오버라이딩 코드를 추가 하여 문제를 해결하였다.

 

하지만 예제는 모두 해결이 되었지만, 테스트 케이스에서 8번부터 실패가 되었다.

 

 

찾아보니 "UDU" 일 경우에는 1이 출력이 되어야한다.

되돌아 가는 경우도 생각해야 하는 것이다.

 

되돌아가는 경우를 고려하기 위해서 출발지점과 도착지점을 모두 관리해야한다.

 

public static class move{
    int fromX;
    int fromY;
    int toX;
    int toY;

    public move(int fromX, int fromY, int toX, int toY) {
        this.fromX = fromX;
        this.fromY = fromY;
        this.toX = toX;
        this.toY = toY;
    }
}

 

출발지점과 도착지점을 관리하는 move class 를 만들었다.

 

public static boolean checkLine(int curX, int curY, int nextX, int nextY){
    for (move item : moveList) {
        if(item.fromX == curX && item.fromY == curY && item.toX == nextX && item.toY == nextY){
            return false;
        }
        if(item.fromX == nextX && item.fromY == nextY && item.toX == curX && item.toY == curY){
            return false;
        }
    }
    return true;
}

 

되돌아가는 경우가 있는지 체크하는 메소드를 별도로 만들었다.

 

이렇게 구현하고나서 다른 코드를 더 찾아봤는데 set 을 이용한 코드를 찾아 볼수 있었다.

set 에 데이터를 add 할때 출발과 도착지점을 문자열로 변환하여 출발 → 도착, 도착 → 출발 두 경우를 모두 넣어 주고 출력할때 set 의 사이즈를 2로 나눈 수를 출력하는 것이였다.

이 방법이 원래 구현하려던 방향과 가장 비슷한 것 같았다.

 

 

전체 코드


728x90