CS/μ•Œκ³ λ¦¬μ¦˜

λ°±μ€€ 9461 파이썬 - νŒŒλ„λ°˜ μˆ˜μ—΄ - 동적 κ³„νšλ²•

πŸŒ»β™š 2021. 10. 8. 15:24

https://www.acmicpc.net/problem/9461

 

9461번: νŒŒλ„λ°˜ μˆ˜μ—΄

였λ₯Έμͺ½ κ·Έλ¦Όκ³Ό 같이 μ‚Όκ°ν˜•μ΄ λ‚˜μ„  λͺ¨μ–‘μœΌλ‘œ 놓여져 μžˆλ‹€. 첫 μ‚Όκ°ν˜•μ€ μ •μ‚Όκ°ν˜•μœΌλ‘œ λ³€μ˜ κΈΈμ΄λŠ” 1이닀. κ·Έ λ‹€μŒμ—λŠ” λ‹€μŒκ³Ό 같은 κ³Όμ •μœΌλ‘œ μ •μ‚Όκ°ν˜•μ„ 계속 μΆ”κ°€ν•œλ‹€. λ‚˜μ„ μ—μ„œ κ°€μž₯ κΈ΄ λ³€μ˜

www.acmicpc.net

ν”Όλ³΄λ‚˜μΉ˜μ™€ λΉ„μŠ·ν•˜κ²Œ κ·œμΉ™μ΄ μžˆλŠ” νŒŒλ„λ°˜ μˆ˜μ—΄μ˜ N번째 값을 κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œμž…λ‹ˆλ‹€. μœ„μ˜ 그림을 보면 μ•Œ 수 μžˆλ“―μ΄... μ •μ‚Όκ°ν˜•μ˜ 변을 따라 계속 λŠ˜λ €κ°€λŠ”λ°... μ •μ‚Όκ°ν˜•μ˜ λ³€μ˜ 길이가 μˆ˜μ—΄μ˜ κ°’μœΌλ‘œ λ“€μ–΄κ°„λ‹€.

 

1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16...

κ°€μž₯ 핡심은 νŒŒλ„λ°˜ μˆ˜μ—΄μ˜ κ·œμΉ™μ„ μ°ΎλŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. 

μœ„μ˜ κ·œμΉ™μ„ 기반으둜 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 근데 쑰건으둜 n이 8보닀 크닀고 적은 μ΄μœ λŠ” μ‹€μ œλ‘œ μ‚¬μš©ν•˜λŠ” μ‚Όκ°ν˜•μ„ κΈ°μ€€μœΌλ‘œ ν•œ 것이고... n이 5보닀 ν¬λ‹€λŠ” 쑰건은 ν•΄λ‹Ή μˆ˜μ—΄μ˜ 첫 3 μˆ«μžκ°€ λͺ¨λ‘ 1이기 λ•Œλ¬Έμ— 8μ—μ„œ 3을 λΊ€ 식 μž…λ‹ˆλ‹€.

 

 

Python 풀이 1

n > 8으둜 κ°€μ •ν•œ 풀이 μž…λ‹ˆλ‹€.

import sys
read = sys.stdin.readline

cache = [0, 1, 1, 1, 2, 2, 3, 4, 5] + [0 for _ in range(100)]

for i in range(9, 101):
    cache[i] = cache[i-1] + cache[i-5]

for _ in range(int(read())):
    print(cache[int(read())])
  • 미리 μ΄ˆκΈ°κ°’μ„ 8번째 μš”μ†ŒκΉŒμ§€ 지정해주고 μ΅œλŒ€ 100κΉŒμ§€ μ°ΎλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄κΈ° λ•Œλ¬Έμ— μ—¬μœ  있게 미리 리슀트λ₯Ό 0으둜 μ±„μ›Œμ€¬μŠ΅λ‹ˆλ‹€.

 

Python 풀이 2

n > 5으둜 κ°€μ •ν•œ 풀이 μž…λ‹ˆλ‹€.

import sys
read = sys.stdin.readline

cache = [0, 1, 1, 1, 2, 2] + [0 for _ in range(100)]

for i in range(6, 101):
    cache[i] = cache[i-1] + cache[i-5]

for _ in range(int(read())):
    print(cache[int(read())])

풀이 1κ³Ό 크게 λ‹€λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 단, μ΄ˆκΈ°κ°’μ„ 쀄이고 계산을 μ‹œμž‘ν•˜λŠ” λ²”μœ„λ₯Ό μ•žλ‹Ήκ²Όμ„ λΏμž…λ‹ˆλ‹€.