Algorithm

[λ°±μ€€] 1965. μƒμž λ„£κΈ° python

🐳 링크

λ°±μ€€ 1965번 μƒμžλ„£κΈ°

πŸ• 문제

μ •μœ‘λ©΄μ²΄ λͺ¨μ–‘μ˜ μƒμžκ°€ 일렬둜 λŠ˜μ–΄μ„œ μžˆλ‹€. μƒμžλ§ˆλ‹€ 크기가 μ£Όμ–΄μ Έ μžˆλŠ”λ°, μ•žμ— μžˆλŠ” μƒμžμ˜ 크기가 뒀에 μžˆλŠ” μƒμžμ˜ 크기보닀 μž‘μœΌλ©΄, μ•žμ— μžˆλŠ” μƒμžλ₯Ό 뒀에 μžˆλŠ” μƒμž μ•ˆμ— 넣을 μˆ˜κ°€ μžˆλ‹€. 예λ₯Ό λ“€μ–΄ μ•žμ—μ„œλΆ€ν„° μˆœμ„œλŒ€λ‘œ 크기가 (1, 5, 2, 3, 7)인 5개의 μƒμžκ°€ μžˆλ‹€λ©΄, 크기 1인 μƒμžλ₯Ό 크기 5인 μƒμžμ— λ„£κ³ , λ‹€μ‹œ 이 μƒμžλ₯Ό 크기 7인 μƒμž μ•ˆμ— 넣을 수 μžˆλ‹€. ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ μƒμžλ₯Ό 넣을 수 μžˆλŠ” 방법은 μ—¬λŸ¬ 가지가 μžˆμ„ 수 μžˆλ‹€. μ•žμ˜ μ˜ˆμ—μ„œ μ°¨λ‘€λŒ€λ‘œ 크기가 1, 2, 3, 7인 μƒμžλ₯Ό μ„ νƒν•˜λ©΄ 총 4개의 μƒμžκ°€ ν•œ 개의 μƒμžμ— λ“€μ–΄κ°€κ²Œ λœλ‹€.

μƒμžμ˜ 크기가 μ£Όμ–΄μ§ˆ λ•Œ, ν•œ λ²ˆμ— 넣을 수 μžˆλŠ” μ΅œλŒ€μ˜ μƒμž 개수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

🐾 풀이 방법

n 길이의 0으둜 μ΄ˆκΈ°ν™”λœ dpλΌλŠ” 배열을 μƒμ„±ν•œλ‹€.
box[i] (0<=i<n) κ°’μ˜ μ•žμ— μžμ‹ λ³΄λ‹€ μž‘μ€ 값이 μ‘΄μž¬ν•œλ‹€λ©΄, κ·Έ κ°’λ“€μ˜ dpκ°’λ“€ 쀑 κ°€μž₯ 큰 maxVal에 μžμ‹ μ„ μΆ”κ°€ν•˜μ—¬ (+1) ν•΄λ‹Ή 값을 dp[box[i]]에 μ €μž₯ν•œλ‹€.

즉, (1,5,2,3,7)의 예λ₯Ό λ“€μ–΄λ³΄μžλ©΄

  • 0번째 κ°’(1)의 κ²½μš°μ—λŠ” μžμ‹ μ΄ 맨 μ²˜μŒμ΄λ―€λ‘œ 무쑰건 dp[0]은 0을 κ°–κ²Œ λœλ‹€.
  • 1번째 κ°’(5)의 κ²½μš°μ—λŠ” μ•žμ— μžμ‹ (5)보닀 μž‘μ€ κ°’(1)이 μžˆμœΌλ―€λ‘œ, 1의 dp값인 1에 μžμ‹ μ„ λ‚˜νƒ€λ‚΄λŠ” 1을 λ”ν•˜μ—¬ 총 2λ₯Ό dp[1]에 μ €μž₯ν•œλ‹€.
  • 2번째 κ°’(2)의 κ²½μš°μ—λŠ” μ•žμ— μžμ‹ (2)보닀 μž‘μ€ κ°’(1)이 μžˆμœΌλ―€λ‘œ, 1의 dpκ°’ + 1을 ν•˜μ—¬ 2λ₯Ό dp[2]에 μ €μž₯ν•œλ‹€.
  • 3번째 κ°’(3)의 κ²½μš°μ—λŠ” μ•žμ— μžμ‹ (3)보닀 μž‘μ€ 값인 (1,2)κ°€ μ‘΄μž¬ν•˜λ―€λ‘œ, (1,2)의 dpκ°’λ“€ 쀑 더 큰 값인 2의 dp값인 2에 +1을 ν•˜μ—¬ 3을 dp[3]에 μ €μž₯ν•œλ‹€.
  • 4번째 κ°’(7)의 κ²½μš°μ—λŠ” μ•žμ— μžμ‹ (7)보닀 μž‘μ€ 값이 (1,2,3)이 μ‘΄μž¬ν•˜λ―€λ‘œ, (1,2,3)의 dpκ°’λ“€ 쀑 κ°€μž₯ 큰 값인 3의 dpκ°’ 3에 +1을 ν•˜μ—¬ 4λ₯Ό dp[4]에 μ €μž₯ν•œλ‹€.

μ΅œμ’…μ μœΌλ‘œ κ°€μž₯ 큰 값을 printν•΄μ•Όν•˜λ―€λ‘œ, max(dp)λ₯Ό 좜λ ₯ν•œλ‹€. #좜λ ₯: 4

λͺ¨λ“  ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€ 성곡 μ½”λ“œ

import sys
sys.stdin = open("input.txt","rt")

n = int(input())
box = list(map(int,input().split()))
dp = [0 for _ in range(n)]
dp[0] = 1

for i in range(1,n):
    maxVal = 0
    for j in range(0,i):
        if box[j] < box[i]:
            maxVal = dp[j] if dp[j] > maxVal else maxVal
    dp[i] = maxVal+1
print(max(dp))