Problem Solving/[ν•­ν•΄99] TIL

99클럽 μ½”ν…Œ μŠ€ν„°λ”” 28일차 TIL / DP(λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°)

geum 2024. 11. 24. 19:01

✏️ 문제

[λ°±μ€€/BOJ] 11055번: κ°€μž₯ 큰 μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄(https://www.acmicpc.net/problem/11055)

 

μˆ˜μ—΄ Aκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, κ·Έ μˆ˜μ—΄μ˜ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄ μ€‘μ—μ„œ 합이 κ°€μž₯ 큰 것을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

예λ₯Ό λ“€μ–΄, μˆ˜μ—΄ A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 κ²½μš°μ— 합이 κ°€μž₯ 큰 μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄μ€ A = {1, 100, 25060, 3, 5, 6, 7, 8} 이고, 합은 113이닀.

 

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

 

🧐 λ‚œμ΄λ„/μ†Œμš” μ‹œκ°„

βœ… λ‚œμ΄λ„: solved.ac κΈ°μ€€ S2

βœ… μ†Œμš” μ‹œκ°„: μΈ‘μ • X

βœ… ꢌμž₯ μ‹œκ°„: 1μ‹œκ°„ 15λΆ„

 

πŸ’‘ 풀이

1) 문제 이해

μ–΄μ œ ν’€μ—ˆλ˜ κ°€μž₯ κΈ΄ κ°μ†Œν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄ λ¬Έμ œμ™€ μœ μ‚¬ν•œ λ¬Έμ œλ‹€. μ΅œμ’… μ •λ‹΅ μ½”λ“œκ°€ μ–΄μ œ μ“΄ μ½”λ“œλž‘ 크게 μ°¨μ΄λ‚˜λŠ” 건 μ•„λ‹ˆμ§€λ§Œ 풀이 방법을 정리해보렀고 ν•œλ‹€.

 

2) 아이디어 흐름 및 μ½”λ“œ

β‘  DP ν…Œμ΄λΈ” μ •μ˜ 및 μ΄ˆκΈ°κ°’ μ±„μš°κΈ°

N = int(input())

A = list(map(int, input().split()))

DP = A.copy()

 

  • DP = A.copy()
    • DP ν…Œμ΄λΈ”μ˜ 각 μΈλ±μŠ€λŠ” ' λ₯Ό λ§ˆμ§€λ§‰ μ›μ†Œλ‘œ ν•˜λŠ” κ°€μž₯ 큰 μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄μ˜ ν•©'을 μ˜λ―Έν•œλ‹€.
    • μ¦κ°€ν•˜λŠ” 뢀뢄이 ν•œ ꡰ데도 μ—†λŠ” κ²½μš°κ°€ μžˆμ„ 수 있기 λ•Œλ¬Έμ— DP ν…Œμ΄λΈ”μ˜ 초기 μƒνƒœλŠ” A와 λ™μΌν•˜λ‹€.

 

β‘‘ μ ν™”식 μœ λ„

for i in range(N):
    for j in range(i):
        if A[i] > A[j] and A[i]+DP[j] > DP[i]:
            DP[i] = A[i]+DP[j]

 

  • A[i] > A[j]
    • A[j]λŠ” A[i] 이전 값을 μ˜λ―Έν•˜κ³  μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄ ν˜•νƒœλ₯Ό 맞좰주기 μœ„ν•΄ 이 쑰건이 ν•„μš”ν•˜λ‹€.
  • A[i]+DP[j] > DP[i]
    • λ₯Ό λ§ˆμ§€λ§‰μœΌλ‘œ ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄μ— DP[j]λ₯Ό μΆ”κ°€ν–ˆμ„ λ•Œμ˜ 합이 κΈ°μ‘΄ DP[i]보닀 큰지 ν™•μΈν•˜λŠ” 쑰건이닀.

 

3) 전체 μ½”λ“œ

N = int(input())

A = list(map(int, input().split()))

DP = A.copy()

for i in range(N):
    for j in range(i):
        if A[i] > A[j] and A[i]+DP[j] > DP[i]:
            DP[i] = A[i]+DP[j]

print(max(DP))

 

4) μ–΄λ €μ› λ˜ 점/배운 점

🚨 μ–΄λ €μ› λ˜ 점

  • TILμ—λŠ” ꡉμž₯히 금방 ν‘Ό κ²ƒμ²˜λŸΌ μ •λ¦¬ν•΄λ’€μ§€λ§Œ A[i]+DP[j] > DP[i]λ₯Ό λŒμ–΄λ‚΄λŠ” 데에 κ½€λ‚˜ 였랜 μ‹œκ°„μ΄ κ±Έλ Έλ‹€.
  • ν”„λ¦°νŠΈλ¬ΈμœΌλ‘œ 쀑간 κ°’ μ°μ–΄κ°€λ©΄μ„œ ν•œμ°Έ 보고 있던 쀑에 μš°μ—°νžˆ μ € 쑰건을 λ°œκ²¬ν•˜κ²Œ 됨

❗ 배운 점

  • 이제 DP ν…Œμ΄λΈ”μ„ μ–΄λ–»κ²Œ μ •μ˜ν•΄μ•Ό 할지가 μ•„μ£Ό 약간은 λˆˆμ— λ³΄μ΄λŠ” 것 κ°™λ‹€.