Problem Solving/BOJ & Programmers

[BOJ] 9095번: 1, 2, 3 λ”ν•˜κΈ°

geum 2024. 9. 3. 19:43

✏️ 문제

μ •μˆ˜ 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의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” λ°©λ²•μ˜ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

πŸ€– μž…μΆœλ ₯ μ˜ˆμ‹œ

 

πŸ’‘ν’€μ΄

이것도 μ•„μ£Ό 유λͺ…ν•œ DP λ¬Έμ œλ‹€. dp[1]~dp[5]의 κ°’κ³Ό κ·Έ 값이 λ‚˜μ˜€λŠ” 쑰합을 직접 μ μ–΄λ³΄λ‹ˆκΉŒ κ·œμΉ™μ΄ λ³΄μ˜€λŠ”λ°, DP μœ ν˜•μœΌλ‘œ μΆ”μ •λ˜λŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 항상 μ†μœΌλ‘œ λ‹€ 적어볼 μˆ˜λŠ” μ—†λŠ” 법..! μ’€ 더 논리적인 접근을 μœ„ν•΄ μ±—μ§€ν”Όν‹°μ˜ 도움을 λ°›μ•˜λ‹€.

 

일단 κ²°λ‘ λΆ€ν„° λ§ν•˜λ©΄ 이 문제의 점화식은 `dp[i] = dp[i-1]+dp[i-2]+dp[i-3]`으둜 μ •μ˜ν•  수 μžˆλ‹€.

 

1) μ˜ˆμ‹œ

 dp[i-1]은 i-1에 1을 λ”ν•˜λŠ” 방법, dp[i-2]λŠ” i-2에 2λ₯Ό λ”ν•˜λŠ” 방법, dp[i-3]은 i-3에 3을 λ”ν•˜λŠ” 방법이닀. 이제 `i=5`둜 κ°€μ •ν•˜κ³  이후 μ„€λͺ…을 μž‘μ„±ν•΄λ³΄κ² λ‹€.

 

β‘  dp[4]

dp[4]λŠ” 숫자 4λ₯Ό 1, 2, 3의 ν•©μœΌλ‘œ λ§Œλ“œλŠ” λ°©λ²•μ˜ 수λ₯Ό μ˜λ―Έν•˜λŠ”λ° 이 λ•Œμ˜ λͺ¨λ“  결과에 1을 λ”ν•˜λ©΄ κ·Έ 값듀이 dp[5]의 일뢀가 λœλ‹€.

 

 

μ–΄ 그림이 λ„ˆλ¬΄ 크닀 γ… 

 

β‘‘ dp[3]

μœ„μ™€ λ™μΌν•˜κ²Œ dp[3]을 κ΅¬μ„±ν•˜λŠ” λͺ¨λ“  값듀에 2λ₯Ό λ”ν•˜λ©΄ κ·Έ 값이 dp[5]의 일뢀가 λœλ‹€. `1+1+1`이 dp[3]의 일뢀인데 여기에 2λ₯Ό λ”ν•œ `1+1+1+2`λŠ” 5κ°€ λ˜λŠ” 것!

 

2) μ½”λ“œ

T = int(input())

dp = [0]*11

dp[1], dp[2], dp[3] = 1, 2, 4

for i in range(4, 11):
    dp[i] = dp[i-1]+dp[i-2]+dp[i-3]
    
for _ in range(T):
    n = int(input())

    print(dp[n])

 

이 λ¬Έμ œλŠ” 쑰금만 더 λΆ™μž‘κ³  μžˆμ—ˆλ‹€λ©΄ λ‚΄ 힘으둜 ν’€μ—ˆμ„ 것 같은데 μ„±κΈ‰ν–ˆλ‹€λŠ” 생각이 λ“ λ‹€. 슀슀둜 μƒκ°ν•˜λŠ” νž˜μ„ κΈ°λ₯΄μž

'Problem Solving > BOJ & Programmers' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ] 1654번: λžœμ„  자λ₯΄κΈ°  (1) 2024.09.18
[BOJ] 7568번: 덩치  (0) 2024.09.09
[BOJ] 1463번: 1둜 λ§Œλ“€κΈ°  (1) 2024.09.03
[BOJ] 11399번: ATM  (0) 2024.08.27
[BOJ] 2839번: 섀탕 배달  (1) 2024.08.27