PS/DP

[λ°±μ€€][JAVA] - 1, 2, 3 λ”ν•˜κΈ°(9095)

Jwhy 2023. 10. 26. 17:11

문제 μ†Œκ°œ

πŸ₯ˆ 문제 레벨 : 싀버3
πŸ”” 문제 μœ ν˜• : λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°
πŸ’¬ 풀이 μ–Έμ–΄ : JAVA
⏱️ 풀이 μ‹œκ°„ : 30λΆ„
πŸ–‡οΈ 문제 링크 : λ°±μ€€ 문제 링크

πŸ“ 문제

μ •μˆ˜ 4λ₯Ό 1, 2, 3의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” 방법은 총 7κ°€μ§€κ°€ μžˆλ‹€. 합을 λ‚˜νƒ€λ‚Ό λ•ŒλŠ” 수λ₯Ό 1개 이상 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

1+1+1+1
1+1+2
1+2+1
2+1+1
2+2
1+3
3+1

μ •μˆ˜ n이 μ£Όμ–΄μ‘Œμ„ λ•Œ, n을 1, 2, 3의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” λ°©λ²•μ˜ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

πŸ€” 문제 뢄석

λ¬Έμ œμ—μ„œ μ–ΈκΈ‰ν•œ 것과 같이 1, 2, 3λ§Œμ„ μ‚¬μš©ν•΄μ„œ 값을 ν‘œν˜„ν•  수 μžˆλŠ” 경우의 수λ₯Ό ꡬ해야 ν•œλ‹€.

0λΆ€ν„° 3κΉŒμ§€ 각각 μ‚¬μš©ν•  수 μžˆλŠ” 경우의 수λ₯Ό 확인해보면 μ•„λž˜μ™€ κ°™λ‹€.

ꡬ뢄 경우의 수 μ‘°ν•©
1 1개 1
2 2개 1 + 1 / 2
3 4개 1 + 1 + 1 / 1 + 2 / 2 + 1 / 3

1, 2, 3을 μ΄μš©ν•΄ 4λ₯Ό λ§Œλ“€ 수 μžˆλŠ” 경우의 수λ₯Ό 보면 μ•„λž˜μ™€ κ°™λ‹€.

  • 1을 μ΄μš©ν•œ μ‘°ν•© : 1개
  • 2을 μ΄μš©ν•œ μ‘°ν•© : 2개
  • 3을 μ΄μš©ν•œ μ‘°ν•© : 4개

4 + 2 + 1둜 총 7개의 경우의 수둜 ꡬ할 수 μžˆλ‹€.

5의 경우λ₯Ό 보면 μ•„λž˜λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

  • 2을 μ΄μš©ν•œ μ‘°ν•© : 2개
  • 3을 μ΄μš©ν•œ μ‘°ν•© : 4개
  • 4λ₯Ό μ΄μš©ν•œ μ‘°ν•© : 7개

즉, (n - 3) + (n - 2) + (n - 1)을 톡해 값을 ꡬ할 수 μžˆλ‹€.

1, 2, 3에 λŒ€ν•œ 값이 ν•„μš”ν•˜λ―€λ‘œ 미리 값을 λ©”λͺ¨μ œμ΄μ…˜(memoization)을 ν•œ λ’€, 풀이해야 ν•œλ‹€.

😎 μ΅œμ’… μ½”λ“œ

λ©”λͺ¨λ¦¬ : 11480 KB
μ‹œκ°„ : 76 ms
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int T = Integer.parseInt(br.readLine());
        int[] dp;

        while (T-- > 0) {
            int n = Integer.parseInt(br.readLine());
            // n의 값은 11 미만이라고 λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— 11둜 μ΄ˆκΈ°ν™”
            dp = new int[11];
            dp[0] = 0;
            dp[1] = 1;
            dp[2] = 2;
            dp[3] = 4;

            for (int i = 4; i <= n; i++) {
                dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
            }

            bw.append(dp[n] + "\n");

        }

        bw.flush();
        bw.close();
        br.close();
    }
}