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는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
풀이
최소의 값을 찾는 방법은 BFS를 이용한다.
현 위치로부터 수빈이가 이동할 수 있는 3개의 경우수를 각각 돌리면서 방문하지 않은 위치라면 방문시킨다.
다만 *2를 하는 작업은 시간이 0이기에 방문하지 않은 장소는 -1로 값을 초기화해서 0인 값도 사용할 수 있도록 해준다.
2022.03.06 - [Algorithm/Baekjoon] - Baekjoon 1697 숨바꼭질 JAVA
코드
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(), k = sc.nextInt(); Queue<int[]> q = new LinkedList<int[]>(); q.add(new int[] { n, 0 }); int[] cur = null, chk = new int[100010]; for(int i=0;i<100001;i++) chk[i]=-1; chk[n] = 0; while (q.size() > 0) { cur = q.poll(); if (cur[0] < 0 || cur[0] > 100000) continue; if (cur[0] * 2 >= 0 && cur[0] * 2 <= 100000 && (chk[cur[0] * 2]>cur[1] || chk[cur[0]*2]==-1)) { chk[cur[0] * 2] = cur[1]; q.add(new int[] { cur[0] * 2, cur[1] }); } if (cur[0] + 1 >= 0 && cur[0] + 1 <= 100000 && (chk[cur[0] + 1]>cur[1]+1 || chk[cur[0]+1]==-1) ) { chk[cur[0] + 1] = cur[1]+1; q.add(new int[] { cur[0] + 1, cur[1] + 1 }); } if (cur[0] - 1 >= 0 && cur[0] - 1 <= 100000 && (chk[cur[0] - 1]>cur[1]+1 || chk[cur[0]-1]==-1)) { chk[cur[0] - 1] = cur[1]+1; q.add(new int[] { cur[0] - 1, cur[1] + 1 }); } } System.out.println(chk[k]); } }
'Algorithm > Baekjoon' 카테고리의 다른 글
Baekjoon 17626 Four Squares JAVA (0) | 2022.03.21 |
---|---|
Baekjoon 9095 1, 2, 3 더하기 JAVA (0) | 2022.03.20 |
Baekjoon 14503 로봇 청소기 JAVA (0) | 2022.03.20 |
Baekjoon 10867 중복 빼고 정렬하기 JAVA (0) | 2022.03.16 |
Baekjoon 9205 맥주 마시면서 걸어가기 JAVA (0) | 2022.03.15 |
댓글