카테고리 없음

프로그래머스: 방문 길이(JAVA)

10Biliion 2025. 6. 4. 18:43

 

게임 캐릭터를 상하좌우로 움직이면서 **지나간 '서로 다른 길의 수'**를 구하는 문제입니다. 단, 한 번 지나간 길은 다시 지나가도 새로운 길로 취급하지 않습니다.


문제 설명

  • 초기 위치: (0, 0)
  • 명령어:
    • U: 위로 한 칸
    • D: 아래로 한 칸
    • L: 왼쪽으로 한 칸
    • R: 오른쪽으로 한 칸
  • 좌표 제한: x, y ∈ [-5, 5]
  • 중복 경로: 같은 길은 한 번만 센다 (양방향 포함)

풀이

  • Set<String>을 사용해서 중복되지 않는 경로만 저장한다.
  • 경로를 "x1,y1,x2,y2" 형식으로 저장하며, 양방향 모두 저장한다.
    • 예: (0,0) → (0,1) 와 (0,1) → (0,0)은 같은 경로로 간주
  • 경계 밖으로 이동하려는 명령은 무시한다.
  • 마지막에 Set 크기를 2로 나눠서 실제 경로 개수를 구한다.

JAVA

import java.util.*;

class Solution {
    public int solution(String dirs) {
        Set<String> map = new HashSet<>();

        int x = 0;
        int y = 0;

        for (int i = 0; i < dirs.length(); i++) {
            int nx = x;
            int ny = y;

            switch (dirs.charAt(i)) {
                case 'U': ny++; break;
                case 'D': ny--; break;
                case 'L': nx--; break; 
                case 'R': nx++; break; 
            }

            // 좌표 제한 벗어나면 무시
            if (nx > 5 || nx < -5 || ny > 5 || ny < -5) continue;

            // 경로 양방향으로 저장
            map.add(x + "," + y + "," + nx + "," + ny);
            map.add(nx + "," + ny + "," + x + "," + y);

            x = nx;
            y = ny;
        }

        return map.size() / 2;
    }
}

 

 

  • 양방향 저장 대신, 항상 (작은 좌표 → 큰 좌표)로 경로를 정렬해서 저장하면 map.size() 그대로 정답이 됩니다.
  • 예를 들어 아래처럼 정렬
String path = Math.min(x, nx) + "," + Math.min(y, ny) + "," + Math.max(x, nx) + "," + Math.max(y, ny);
map.add(path);