코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍
알고리즘/백준

[백준] 13549번 : 숨바꼭질 3

알고리즘/백준

[백준] 13549번 : 숨바꼭질 3

2024. 1. 23. 20:59

https://www.acmicpc.net/problem/13549

 

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의 위치로 이동하게 된다.

 

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

 

출력

수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

 


소스코드

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

class Main {
    static int n, k;
    static int arr[];
    static boolean visited[];

    static class Node implements Comparable<Node> {
        int x;
        int value;

        public Node(int x, int value) {
            this.x = x;
            this.value = value;
        }

        @Override
        public int compareTo(Node o) {
            return this.value - o.value;
        }
    }
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        arr = new int[100001];
        visited = new boolean[100001];

        System.out.println(bfs(n));
    }

    static int bfs(int x) {
        PriorityQueue<Node> pq = new PriorityQueue<>();
        pq.add(new Node(x, 0));

        if(x == k) return 0;
        while(!pq.isEmpty()) {
            Node node = pq.poll();
            int curX = node.x;
            visited[curX] = true;
            if(curX == k) return node.value;

            if(curX * 2 < 100001 && !visited[curX * 2]) pq.add(new Node(curX * 2, node.value));
            if(curX + 1 < 100001 && !visited[curX + 1]) pq.add(new Node(curX + 1, node.value + 1));
            if(curX - 1 >= 0 && !visited[curX - 1]) pq.add(new Node(curX - 1, node.value + 1));
        }

        return -1;
    }
}

 

 

해결 방법

  1. BFS를 사용하였고 가중치가 있는 경로이기에 우선순위 큐에 이동 가능한 정점을 넣었다.
  2. 가중치가 짧은 정점이 우선순위가 되도록 기준을 잡아 가장 먼저 도착하는 정점이 최단 거리가 된다.
  3. 순서에 따른 의존도가 생기지 않도록 우선순위 큐에서 정점을 꺼냈을 때 방문 처리를 했다.

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 19699번 : 소-난다!  (1) 2024.01.29
[백준] 21608번 : 상어 초등학교  (0) 2024.01.28
[백준] 2468번 : 안전 영역  (0) 2024.01.22
[백준] 11660번 : 구간 합 구하기 5  (0) 2024.01.22
[백준] 12018번 : Yonsei TOTO  (1) 2024.01.21
  • 문제
  • 입력
  • 출력
  • 소스코드
  • 해결 방법
'알고리즘/백준' 카테고리의 다른 글
  • [백준] 19699번 : 소-난다!
  • [백준] 21608번 : 상어 초등학교
  • [백준] 2468번 : 안전 영역
  • [백준] 11660번 : 구간 합 구하기 5
코딍코딍
코딍코딍
ㅎ2

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.