관리 메뉴

NineTwo meet you

[백준/자바] 13913 숨바꼭질 4 본문

프로그래밍 문제/백준

[백준/자바] 13913 숨바꼭질 4

NineTwo 2021. 1. 15. 19:39
반응형

13913 숨바꼭질 4 사진 클릭시 문제로 이동


문제

수빈이는 동생과 숨바꼭질을 하고 있다.

수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 

수빈이는 걷거나 순간이동을 할 수 있다.

만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다.

순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.

입력

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

N과 K는 정수이다.

출력

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

둘째 줄에 어떻게 이동해야 하는지 공백으로 구분해 출력한다.

예제 입력 1

5 17

예제 출력 1

4
5 10 9 18 17

예제 입력 2

5 17

예제 출력 2

4
5 4 8 16 17

설명

해당 문제는 다음과 같은 알고리즘 분류를 가진다.

  • 그래프 이론
  • 그래프 탐색
  • 너비 우선 탐색

이 문제는 스페셜 저지 문제로 여러 개의 답이 존재하고 이중 한 가지를 정답으로 제출하면 된다.

이런 이유 때문에 예제의 입력이 5 17로 같지만 다른 답일 출력되어 있는 것을 확인할 수 있다.

 

해당 문제 역시 1697 숨바꼭질의 문제를 기본으로 해결할 수 있었다.

 

가장 최소의 시간을 구하기 위해서는 visited배열을 이용해 해당 위치의 방문한 적이 있는지 여부를 판단했다.

 

이문제와 1697 숨바꼭질의 차이점은 최소 시간의 경로를 출력하는 것이다.

이를 위해서 다음과 같이 부모의 index를 저장하는 배열을 설정해줬다.

static int parents[] = new int[100001];

 

동생의 위치에 도달했을 때 stack을 사용해 경로를 출력할 수 있다.

index 5 10 9 18 17
parents[index]   5 10 9 18

stack에 저장되는 순서는 다음과 같다.

index parents[index] stack ->        
    17        
17 18 17 18      
18 9 17 18      
9 10 17 18 9    
10 5 17 18 9 10  
5 0 17 18 9 10 5

stack이 빌때까지 pop하면 해당 경로를 구할 수 있다.

코드

반응형
Comments