CodingTest/Python

BOJ_9095 : 1, 2, 3 λ”ν•˜κΈ°

Soom_1n 2022. 9. 3. 02:29

γ…ŠπŸ‘‰ 문제링크

 

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

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€, n을 1, 2, 3의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” λ°©λ²•μ˜ 수λ₯Ό 좜λ ₯ν•œλ‹€.

www.acmicpc.net



πŸ”Έ 문제 뢄석 πŸ”Έ

  • μž…λ ₯받은 수λ₯Ό 1,2,3으둜 λ§Œλ“€ 수 μžˆλŠ” 경우의 수λ₯Ό 좜λ ₯ν•œλ‹€.
  • dp와 νšŒκ·€ 방법 두 κ°€μ§€λ‘œ 풀이 κ°€λŠ₯ν•œλ°, dp둜 ν’€μ΄ν–ˆλ‹€.
    • 1,2,3 을 λ§Œλ“œλŠ” 경우의 μˆ˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.
      • (1) : 1  >> 1개
      • (2) : 1+1 , 2  >> 2개
      • (3) : 1+1+1, 1+2, 2+1, 3  >> 4개
    • 1,2,3은 κΈ°λ³Έκ°’μœΌλ‘œ μ €μž₯해두고, 4λΆ€ν„° '1,2,3 λ”ν•˜κΈ° μ–΄λ–€ 수'의 경우의 수λ₯Ό μƒκ°ν•œλ‹€.
      • 1+3 : 1 + (3을 ν‘œν˜„ ν•  수 μžˆλŠ” 경우의 수)  >> 1+(1+1+1), 1+(1+2), 1+(2+1), 1+(3)
      • 2+2 : 2 + (2λ₯Ό ν‘œν˜„ ν•  수 μžˆλŠ” 경우의 수)  >> 2+(1+1) , 2+(2)
      • 3+1 : 3 + (1을 ν‘œν˜„ ν•  수 μžˆλŠ” 경우의 수)  >> 3+(1)
      • μ΄λ ‡κ²Œ λͺ¨λ“  쑰합이 κ°€λŠ₯ν•œλ°, κ²°κ΅­ 점화식은 dp[n] = dp[n-3] + dp[n-2] + dp[n-1] 이 λœλ‹€ .

πŸ”Έ μ½”λ“œ πŸ”Έ

dp = [1,2,4]
for _ in range(int(input())):
    t = int(input())
    
    if len(dp) < t:
        for _ in range(t - len(dp)):
            dp.append(dp[-1] + dp[-2] + dp[-3])
    
    print(dp[t-1])

πŸ”Έ μ½”λ“œ 해석 πŸ”Έ

  • dp λ¦¬μŠ€νŠΈμ— 1,2,3의 경우의 수 1,2,4λ₯Ό μ €μž₯ν•œλ‹€.
  • μž…λ ₯받은 μˆ˜κ°€ dp리슀트의 크기보닀 크면(μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 인덱슀면), 차이만큼 λ°˜λ³΅λ¬Έμ„ 돌렀 리슀트λ₯Ό λŠ˜λ¦°λ‹€.
  • dp λ¦¬μŠ€νŠΈμ—μ„œ μž…λ ₯ 수 인덱슀의 값을 좜λ ₯ν•œλ‹€.

πŸ”Έ end πŸ”Έ

  • 반볡 κ·œμΉ™μ€ λˆˆμΉ˜μ±˜μ§€λ§Œ, 원리가 μ΄ν•΄λ˜μ§€ μ•Šμ•„μ„œ 풀이 ν¬μŠ€νŒ…μ„ μ°Ύμ•„λ³΄μ•˜λ‹€.
    • 경우의 μˆ˜κ°€ λŠ˜μ–΄λ‚˜λŠ” 원리λ₯Ό κ°„λ‹¨νžˆ 이해할 수 μžˆμ—ˆλ‹€.
  • λ‹€λ₯Έ κΈ€μ—μ„œ νšŒκ·€λ‘œ 원리λ₯Ό μ„€λͺ…ν•œ κ±Έ λ΄€λŠ”λ°, 글이 κΈΈμ–΄μ§ˆκΉŒλ΄ μ„€λͺ…ν•˜μ§„ μ•Šμ•˜λ‹€.
    • 0λΆ€ν„° 1, 2, 3을 λ”ν•˜κ³ , 각 κ°’μ—μ„œ λ‹€μ‹œ 1, 2, 3을 더해가며 μˆ˜κ°€ 계속 λŠ˜μ–΄λ‚˜λŠ” 원리닀.
  • dp문제λ₯Ό 더 μ—°μŠ΅ν•΄μ•Όκ² λ‹€.

728x90