본문 바로가기

CodingTEST

[백준 13549] 숨바꼭질 3(JAVA)

반응형

백준 13549번 문제 - 숨바꼭질 3

 

13549번: 숨바꼭질 3

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때

www.acmicpc.net


문제 분석 

 

 

  • 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다
  • 수빈이는 걷거나 순간이동을 할 수 있다. 
    • 수빈이의 위치가 X일 때 걷는다면 1초 후 X-1 또는 X+1로 이동하게 된다.
    • 순간이동을 하는 경우에는 0초 후2*X의 위치로 이동하게 된다.
  •  수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 출력해라.

해결 포인트

 

  • 다익스트라(Dijkstra) 알고리즘 사용
  • 최소시간을 알기 위한 Result 클래스 구현
    • 위치 값 n
    • 움직인 시간 count
  • Result Comparable는 움직인 시간이 작은 순으로 정렬되도록 구현
  • 우선순위 큐 사용
    •  Queue<Result> q = new PriorityQueue<>(); 
  • 방문 확인 visited 배열 구현
  • 처음 언니 시작 위치 큐에 삽입 
    •  q.add(new Result(N, 0)); 
  • 동생 위치에 도착했을 때까지 반복
    • 큐에서 하나 꺼내기
    • 방문한 위치면 패스(continue)
    • 방문 안한 위치면 방문 등록 후, 갈 수 있는 공간 큐에 추가
      q.add(new Result(value.n + 1, value.count + 1));
      q.add(new Result(value.n - 1, value.count + 1));
      q.add(new Result(value.n * 2, value.count));
  • 동생과 동일한 위치일 경우, value.count 반환 및 출력

코드

 

import java.io.*;
import java.util.*;

public class Main {
    public static int MAX = 100001;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        bw.write(Dijkstra(N, K) + "\n");
        bw.flush();
        bw.close();
    }

    public static int Dijkstra(int N, int K) {
        Queue<Result> q = new PriorityQueue<>();
        boolean[] visited = new boolean[MAX];

        q.add(new Result(N, 0));

        while (!q.isEmpty()) {
            Result value = q.poll();
            if (value.n == K) {
                return value.count;
            }

            if (checkRound(value.n) && !visited[value.n]) {
                visited[value.n] = true;

                q.add(new Result(value.n + 1, value.count + 1));
                q.add(new Result(value.n - 1, value.count + 1));
                q.add(new Result(value.n * 2, value.count));
            }
        }
        return 0;
    }

    public static boolean checkRound(int n) {
        return n >= 0 && n < MAX;
    }

    public static class Result implements Comparable<Result>{
        int n;
        int count;
        public Result(int n, int count) {
            this.n = n;
            this.count = count;
        }

        @Override
        public int compareTo(Result o) {
            if(count == o.count)
                return n - o.n;
            return count - o.count;
        }
    }
}
반응형

'CodingTEST' 카테고리의 다른 글

[백준 1967] 트리의 지름(JAVA)  (1) 2024.02.11
[백준 1753] 최단경로(JAVA)  (1) 2024.02.11
[백준 1916] 최소비용 구하기(JAVA)  (1) 2024.02.11
[백준 2002] 추월(JAVA)  (0) 2024.02.11
[백준 9465] 스티커(JAVA)  (0) 2024.02.11