IT/알고리즘
백준 1697 숨바꼭질 자바
어센트
2020. 4. 26. 17:34
https://www.acmicpc.net/problem/1697
1697번: 숨바꼭질
문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지
www.acmicpc.net
BFS로 해결하는 문제였다. 현재위치에서 방문할 수 있는 경우를 3가지로 두고 BFS로 해결하였다.
풀이
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | package DFS_BFS; import java.io.*; import java.util.*; public class 숨바꼭질 { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int k = Integer.parseInt(st.nextToken()); boolean[] vis = new boolean[100000+1]; int[] hop = new int[100001]; Queue<Integer> q = new LinkedList<>(); int ans = bfs(0,q,vis,hop,n,k); System.out.println(ans); } static int bfs(int res,Queue<Integer> q,boolean[] vis,int[] hop,int n,int k ){ int present = n; q.add(n); vis[n] = true; while(!q.isEmpty() ) { present = q.poll(); if(present == k){ return hop[present]; } res++; if(present+1<vis.length && !vis[present+1]){ hop[present+1] = hop[present]+1; vis[present+1] = true; q.add(present+1); } if(present-1>=0 && !vis[present-1]){ hop[present-1] = hop[present]+1; vis[present-1] = true; q.add(present-1); } if(present*2<vis.length && !vis[present*2]){ hop[present*2] = hop[present]+1; vis[present*2] = true; q.add(present*2); } } return res; } } | cs |