멍두의 개발새발

[백준] 1로 만들기 in Java 본문

Algorithm/BOJ

[백준] 1로 만들기 in Java

멍두 2024. 7. 13. 16:00
반응형

📍 문제

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

📍 코드 설명

n % 3 ==  0 이면 n/3 , n% 2 == 0이면 n/2, n-1

3가지 연산을 진행해서 가장 빨리 1에 도달하는 연산횟수를 찾는 문제

 

입력의 크기가 1 ~ 10^6이고 시간 제한 0.15초이므로 모든 경우의 수를 계산하면 시간 초과 

직전의 연산 결과를 기억하고 계산하는 DP 문제로 예상가능

 

재귀문제로 접근

1. 종료 조건 : 현재 탐색 횟수 count 가 현재 탐색최소 탐색 횟수 1보다 클 때 굳이 계산할 필요 X

2. n의 초기 값은 integer max => 가장 먼저 1에 접근한 count를 min으로 저장하기 위해

3.  n이 1에 도달시 min과 비교하여 더 작은 값을 min에 저장

4. n/3 , n/2 , n-1 계산

📍 코드

✔️ 코드

더보기
import java.util.*;

public class Main
{
    static int min = Integer.MAX_VALUE;
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        toOne(n, 0);
        
        System.out.println(min);
    }
    
    static void toOne(int n, int count){
        //현재 coun 최소값보다 크면 굳이 검사할 필요 X
        if(count > min){
            return;
        }
                
        if(n==1){
            min = Math.min(min, count);
        }
        
        if(n % 3 == 0){
            toOne(n/3, count+1);
        }
        if(n% 2== 0){
            toOne(n/2, count+1);
        }
        toOne(n-1, count+1);
    }
}

 

📍 틀린이유

List 사용하여 시간초과

이런 DP 문제는 재귀나 배열을 사용하자

 

 

반응형

'Algorithm > BOJ' 카테고리의 다른 글

[백준] solved.ac (in Java)  (2) 2024.10.18
[백준] IOIOI in Java  (0) 2024.10.16
[백준] 나이순 정렬 in Java  (0) 2024.07.30
[백준] 1,2,3 더하기 in Java  (5) 2024.07.14
[백준] 2xn 타일링 in Java  (4) 2024.07.13