새벽코딩

[백준] [16953] A -> B 본문

알고리즘

[백준] [16953] A -> B

J 코딩 2022. 12. 13. 01:19
반응형

문제

정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.

  • 2를 곱한다.
  • 1을 수의 가장 오른쪽에 추가한다. 

A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.

입력

첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.

출력

A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.

예제 입력 1 복사

2 162

예제 출력 1 복사

5

2 → 4 → 8 → 81 → 162

예제 입력 2 복사

4 42

예제 출력 2 복사

-1

예제 입력 3 복사

100 40021

예제 출력 3 복사

5

100 → 200 → 2001 → 4002 → 40021

 

※코드 

 

import java.io.*;
import java.util.*;

public class Main {
	static boolean [] visited;
	static HashMap<Long, Integer> dap;
	static long A, B;
	
	static void BFS(long s) {
		Queue<Long> q = new LinkedList<>();
		q.offer(s);
		dap.put(s, 1);
		while(!q.isEmpty()) {
			long now = q.poll();
			
			long nextP1 = now * 2;
			long nextP2 = Long.parseLong(String.valueOf(now) + String.valueOf(1));
			
			if(nextP1 <= B && !dap.containsKey(nextP1)){
				q.offer(nextP1);
				dap.put(nextP1, dap.get(now)+1);
			}
			if(nextP2 <= B && !dap.containsKey(nextP2)) {
				q.offer(nextP2);
				dap.put(nextP2, dap.get(now)+1);
			}
		}
	}
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		st = new StringTokenizer(br.readLine());
		dap = new HashMap<>();
		A = Integer.parseInt(st.nextToken());
		B = Integer.parseInt(st.nextToken());
		
		BFS(A);
		int result = -1;
		
		if(dap.containsKey(B)) result = dap.get(B);
		
		System.out.println(result);
	}

}

 

※생각정리

 

입력된 A값에 곱하기 2 또는 뒤에 1을 붙인수로 계속해서 값을 이어 붙여 큐에 담았다. 연산한 값이 B값을 넘으면 더이상 큐에 담지 않으면서 같은 방법을 반복했다.

 

배열에 담으면 메모리초과를 피할 수 없기 때문에 필요한 값만 담기위해 HashMap을 이용해 해당 숫자까지 오는데 걸린 가중치를 담았다.

 

 

 

 

-새벽코딩-

반응형

'알고리즘' 카테고리의 다른 글

[백준] [5567] 결혼식 (JAVA)  (0) 2022.12.14
[백준] [2178] 미로탐색 (JAVA)  (0) 2022.12.13
[백준] [1743] 음식물 피하기  (0) 2022.12.11
[백준] [2644] 촌수계산  (2) 2022.12.10
[백준] [11725] 트리의 부모 찾기  (0) 2022.12.09
Comments