Publish:

νƒœκ·Έ: , , , , ,

μΉ΄ν…Œκ³ λ¦¬:

img_3.png

문제

문제 링크

img_3.png

μ„€λͺ…

μž…λ ₯ κ°’ n 이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 1κ³Ό 2의 ν•©μœΌλ‘œλ§Œ κ·Έ 수λ₯Ό λ§Œλ“œλŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” 문제

풀이

λ™μ κ³„νšλ²•(λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°, DP) : 각각의 경우의 수λ₯Ό λμžλ¦¬κ°€ 1둜 λλ‚˜λŠ” κ²½μš°μ™€ 2둜 λλ‚˜λŠ” 경우둜 λΆ„λ¦¬ν•΄μ„œ 적어보면 μ•„λž˜μ™€ κ°™λ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// n = 3
     [2,1]
     [1,1,1]
     [1,2]
// 1둜 λλ‚˜λŠ” 경우: 2개, 
// 2둜 λλ‚˜λŠ” 경우: 1개

// n = 4
   [2, 1, 1]
   [1, 2, 1]
   [1, 1, 1, 1]
   [1, 1, 2]
   [2, 2]
// 1둜 λλ‚˜λŠ” 경우: 3개,
// 2둜 λλ‚˜λŠ” 경우: 2개

// n = 5
   [2, 1, 1, 1]
   [1, 2, 1, 1]
   [1, 1, 1, 1, 1]
   [1, 1, 2, 1]
   [2, 2, 1]
   [2, 1, 2]
   [1, 2, 2]
   [1, 1, 1, 2]
// 1둜 λλ‚˜λŠ” 경우: 5개,
// 2둜 λλ‚˜λŠ” 경우: 3개

생각해보면, λ§ˆμ§€λ§‰μ— 1을 λ”ν•˜λŠ” 경우의 μˆ˜λŠ” n - 1 경우의 μˆ˜μ™€ κ°™λ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ λ§ˆμ§€λ§‰μ— 2λ₯Ό λ”ν•˜λŠ” κ²½μš°λŠ” n - 2 의 경우의 μˆ˜μ™€ κ°™λ‹€.

예λ₯Ό λ“€μ–΄ n = 5μΌλ•Œ 1둜 λλ‚˜λŠ” κ²½μš°λŠ” n = 4의 μΌ€μ΄μŠ€μ— 1만 λ”ν•΄μ£ΌλŠ” κ²°κ³Όμ΄λ―€λ‘œ 4의 경우의 μˆ˜μ™€ κ°™κ³  2둜 λλ‚˜λŠ” κ²½μš°λŠ” n = 3 의 μΌ€μ΄μŠ€μ— 2λ₯Ό 더해쀀 결과와 κ°™λ‹€. 이λ₯Ό μ‹μœΌλ‘œ λ‚˜νƒ€λ‚΄λ©΄ i(n) = i(n - 1) + i(n - 2) κ°€ λœλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
  public long solution(int n) {
    long answer;
    int[] dp = new int[2001];
    dp[1] = 1;
    dp[2] = 2;
    dp[3] = 3;
    for (int i = 4; i < dp.length; i++) {
      dp[i] = (dp[i - 1] + dp[i - 2]) % 1234567;
    }
    answer = dp[n];

    return answer;
  }
}

회고

이런 λ¬Έμ œλŠ” 경우의 수λ₯Ό 적어보면 ν’€ 수 μžˆλŠ” λ¬Έμ œμ΄μ§€λ§Œ, κ·Έλž˜λ„ 점화식이 잘 보이지 μ•Šμ„λ• 1둜 λλ‚˜λŠ” μˆœμ„œ, 2둜 λλ‚˜λŠ” μˆœμ„œ λ“±μœΌλ‘œ 적어보면 κ·œμΉ™μ„ λ°œκ²¬ν•  수 μžˆλ‹€.

λ°©λ¬Έν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! λŒ“κΈ€,지적,ν”Όλ“œλ°± μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€πŸ˜Š

λŒ“κΈ€λ‚¨κΈ°κΈ°