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 |
'IT > 알고리즘' 카테고리의 다른 글
백준2579 계단오르기 (0) | 2020.05.03 |
---|---|
백준 1149 RGB거리 (0) | 2020.04.28 |
백준 9461 파도반 수열 자바 (0) | 2020.04.26 |
백준 1904 01타일 자바 (0) | 2020.04.25 |
백준 1238 파티 (0) | 2020.04.07 |