image

백준 15989: 1,2,3 더하기 4

Link: https://www.acmicpc.net/problem/15989

풀이

첫번째 풀이

  • 처음에는 단순히 조합으로 풀이했다.
  • 1,2,3 중 원소를 중복으로 사용하며 조합으로 풀이
  • 당연하게도 실패

두번째 풀이

  • 1,2,3으로 각각 이루어진 원소들 + 2,3이 합쳐진 원소를 더해서 구했다.
  • 비효율적이지만 어쨋든 정답
  • 아래는 조합메서드와 두번째 풀이 코드
  import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws  Exception{
        int T = Integer.parseInt(br.readLine());
        for(int t= 0;t<T;t++){
            int n = Integer.parseInt(br.readLine());
            int cnt = 1+n/2+n/3;
            for(int i =1;i<=n/2;i++){
                for(int j =1;j<=n/3;j++){
                    if(i*2+j*3<=n){
                        cnt++;
                    }else{
                        break;
                    }
                }
            }
            sb.append(cnt).append("\n");
        }
        System.out.println(sb);
    }

    static int comb(int n, int sum, int cur){
        if(sum==n){
            return 1;
        }
        int cnt = 0;
        for(int i = cur;i<=3;i++){
            if(sum+i<=n){
                cnt+=comb(n,sum+i, i);
            }
        }
        return cnt;
    }

}

세번째 풀이

  • 두번째 풀이로 정답이 나온 후, 내 코드가 너무 느리다는 것을 발견
  • 다른 사람의 코드를 보니 dp로 푸는 문제였음.
  • n번째 수를 1,2,3으로 나타내는 것을 오름차순 정렬했을 때의 경우의 수는 다음과 같다.
    • 1로 끝나는 경우
    • n-2의 1로 끝나는 경우 + n-2의 2로 끝나는 경우 -> 마지막에 2를 하나 추가할 수 있으니
    • n-3의 1로 끝나는 경우 + n-3의 2로 끝나는 경우, n-3의 3으로 끝나는 경우 -> 마지막에 3을 추가할 수 있으니
  • 이렇게 계산하여 n번째수의 1,2,3으로 ㅅ끝나는 경우를 모두 더하면 된다.
package algorithm2024.sep.day13;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ_15989_123_더하기_4 {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws  Exception{
        int T = Integer.parseInt(br.readLine());
        for(int t= 0;t<T;t++){
            int n = Integer.parseInt(br.readLine());
            int cnt = 0;
            int[][] dp = new int[10001][4];
            dp[1][1] = 1;
            dp[2][1] = 1;
            dp[2][2] = 1;
            dp[3][1] = 1;
            dp[3][2] = 1;
            dp[3][3] = 1;
            for(int i =4;i<=n;i++){
                dp[i][1] = 1;
                dp[i][2] = dp[i-2][1] + dp[i-2][2];
                dp[i][3] = dp[i-3][1] + dp[i-3][2] + dp[i-3][3];
            }
            cnt = dp[n][1] + dp[n][2] + dp[n][3];
            sb.append(cnt).append("\n");
        }
        System.out.println(sb);
    }

}



Issue

  • 문제를 풀어도 풀이에 확신이 없다면 정석 풀이를 보도록 하자.
  • 비슷한 유형을 동일한 방법으로 풀었을 때 맞을 것이란 보장이 없다.

Leave a comment