알고리즘

백준 25418번 정수 a를 k로 만들기 (JAVA)

박카스마시며코딩 2022. 10. 23. 21:27

https://www.acmicpc.net/problem/25418

 

25418번: 정수 a를 k로 만들기

7(A), 8(연산 1), 9(연산 1), 18(연산 2), 19(연산 1), 38(연산 2), 76(연산 2), 77(연산 1)이 최소 연산이므로 정답은 7이다.

www.acmicpc.net

 

 

 

package BOJ.bfs;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_25418 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Integer> stoi = Integer::parseInt;
        int start = stoi.apply(st.nextToken());
        int end = stoi.apply(st.nextToken());
        int result = bfs(start,end);
        System.out.println(result);
    }

    private static int bfs(int start, int end) {
        Queue<Integer> q = new LinkedList<>();
        Set<Integer> visited = new HashSet<>();
        q.offer(start);
        visited.add(start);
        int time = 0;
        while(!q.isEmpty()){
            int size = q.size();
            for(int s = 0 ; s < size ; s++){
                int num = q.poll();
                if(num == end){
                    return time;
                }
                int next = num+1;
                if(!visited.contains(next)){
                    q.offer(next);
                    visited.add(next);
                }
                next = 2 * num;
                if(next > 2_000_000){
                    continue;
                }
                if(!visited.contains(next)){
                    q.offer(next);
                    visited.add(next);
                }
            }
            time++;
        }
        return -1;
    }
}