알고리즘

[백준, 자바, 1463번] 1로 만들기

hminor 2024. 10. 23. 16:13
반응형

풀이

  • 뭔가 시간 제한이 짧아서 걱정했지만,
  • 간단히 해결 가능했음.
  • 우선 bfs처럼 deque에 추가하기 전에 추가할 값에 해당하는 li의 index를 변경 후 추가
  • 이렇게 함으로써 같은 걸, 추가하지 않고 빠르게 해결하고자 했음.

 

import java.util.*;

public class _1463 {
    static Deque<List<Integer>> dq = new ArrayDeque<>();
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        boolean[] li = new boolean[N+1];
        dq.add(new ArrayList<>(Arrays.asList(N,0)));
        li[N] = true;

        while (!dq.isEmpty()) {
            List<Integer> now = dq.pollFirst();
            if (now.get(0)==1) {
                System.out.println(now.get(1));
                break;
            }
            if (now.get(0)%3==0 && !li[now.get(0)/3]) {
                li[now.get(0)/3] = true;
                dq.add(new ArrayList<>(Arrays.asList(now.get(0)/3,now.get(1)+1)));
            } if (now.get(0)%2==0 && !li[now.get(0)/2]) {
                li[now.get(0)/2] = true;
                dq.add(new ArrayList<>(Arrays.asList(now.get(0)/2,now.get(1)+1)));
            } if (now.get(0)-1>0 && !li[now.get(0)-1]) {
                li[now.get(0)-1] = true;
                dq.add(new ArrayList<>(Arrays.asList(now.get(0)-1,now.get(1)+1)));
            }
        }
    }
}