05-15 08:39
Recent Posts
Recent Comments
관리 메뉴

miinsun

[BAEKJOON] λ°±μ€€ BFS 12851 :: μˆ¨λ°”κΌ­μ§ˆ 2 λ³Έλ¬Έ

Algorithm/Baekjoon

[BAEKJOON] λ°±μ€€ BFS 12851 :: μˆ¨λ°”κΌ­μ§ˆ 2

miinsun 2022. 7. 8. 22:02

πŸ’¬  문제 μ„€λͺ…

μˆ˜λΉˆμ΄λŠ” 동생과 μˆ¨λ°”κΌ­μ§ˆμ„ ν•˜κ³  μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” ν˜„μž¬ 점 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
2

 

​

πŸ’»  Main.java

수빈이의 ν˜„μž¬ μœ„μΉ˜κ°€ 5이고, λ™μƒμ˜ μœ„μΉ˜κ°€ 17일 λ•Œ λ‹€μŒκ³Ό κ°™λ‹€.

nμ—μ„œ n-1, n+1,n*2 3가지 λ°©λ²•μœΌλ‘œ λ»—μ–΄λ‚˜κ°„λ‹€κ³  μƒκ°ν•΄λ³΄μž. BFSλ₯Ό μ΄μš©ν•΄ 문제λ₯Ό 풀이해봀닀.

4μ—μ„œ 3, 5,8둜 λ»—μ–΄κ°ˆλŒ€ 5λŠ” 이미 level1μ—μ„œ λ‚˜μ™”κΈ° λ•Œλ¬Έμ— level2μ—μ„œ 5λ₯Ό λ°©λ¬Έν•  ν•„μš”κ°€ μ—†λ‹€. (즉 5λŠ” 1초면 도달가λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— 2μ΄ˆμ— 걸쳐 5λ₯Ό λ°©λ¬Έν•  ν•„μš”κ°€ μ—†λ‹€λŠ” 뜻) 3μ—μ„œ 2,4,6으둜 λ»—μ–΄λ‚˜κ°ˆ λ•Œλ„ λ‹€μŒκ³Ό 같은 이유둜 4, 6은 λ°©λ¬Έν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

/* λ°±μ€€ - 12851 :: μˆ¨λ°”κΌ­μ§ˆ 2 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
	
	public static void main(String[] args)throws IOException { 
		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());
		
		int[] min = new int[100001]; 
		Queue<Integer> q = new LinkedList<>();
		q.add(n);
		min[n] = 1;
		
		int cnt = 0;
		while(!q.isEmpty()) {
			int cur = q.poll();
			
			// 동생을 λ§Œλ‚˜λ©΄ 카운트 증가
			if(cur == k)
				cnt++;
			
			// μ•žμœΌλ‘œ ν•œμΉΈ κ±Έμ–΄κ°€κΈ°
			if(cur - 1 >= 0 && cur - 1 <= 100000) {
				if(min[cur - 1] == 0 || min[cur - 1] >= min[cur] + 1) {
					min[cur - 1] = min[cur] + 1;
					q.add(cur - 1);
				}
			}
			
			// λ’€λ‘œ ν•œμΉΈ κ±Έμ–΄κ°€κΈ°
			if(cur + 1 >= 0 && cur + 1 <= 100000) {
				if(min[cur + 1] == 0 || min[cur + 1] >= min[cur] + 1) {
					min[cur + 1] = min[cur] + 1;
					q.add(cur + 1);
				}
			}
			
			// μˆœκ°„μ΄λ™
			if(cur * 2 >= 0 && cur * 2 <= 100000) {
				if (min[cur * 2] == 0 || min[cur * 2] >= min[cur] + 1) {
					min[cur * 2] = min[cur] + 1;
					q.add(cur * 2);
				}
			}
		}
		
		System.out.println(min[k] - 1);
		System.out.println(cnt);
		br.close();
		
	}
}
Comments