🧩 Algorithm/[BOJ] Silver

BOJ 11053번 : κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄ (Python/Silver 2)

devCloud 2023. 10. 22. 22:27
728x90
 

11053번: κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄

μˆ˜μ—΄ Aκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 예λ₯Ό λ“€μ–΄, μˆ˜μ—΄ A = {10, 20, 10, 30, 20, 50} 인 κ²½μš°μ— κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄μ€ A = {10, 20, 10, 30, 20, 50} 이

www.acmicpc.net


μ„€λͺ…

λΆ€λΆ„ μˆ˜μ—΄μ˜ μ΅œλŒ€ 길이λ₯Ό ꡬ해야 ν•˜λŠ” λ¬Έμ œμ΄λ‹€. λΆ€λΆ„ μˆ˜μ—΄μ΄λž€ μ£Όμ–΄μ§„ μˆ˜μ—΄μ˜ 일뢀 항을 μ›λž˜ μˆœμ„œλŒ€λ‘œ λ‚˜μ—΄ν•˜μ—¬ 얻을 수 μžˆλŠ” μˆ˜μ—΄μ΄λ‹€. μ‰½κ²Œ λ§ν•΄μ„œ 이전 μˆ˜λ³΄λ‹€ 크면 μˆ˜μ—΄μ΄ 이루어진닀. ν”νžˆ μˆ˜ν•™μ—μ„œ λ³΄μ•˜λ˜ 두 ν•­μ˜ 차이가 μΌμ •ν•œ λ“±μ°¨μˆ˜μ—΄μ„ λ§ν•˜λŠ” 것이 μ•„λ‹ˆλ‹€. 

 

예λ₯Ό λ“€μ–΄, A : { 10, 20, 10, 30, 20, 50 } μ΄λΌλŠ” μˆ˜μ—΄μ΄ μžˆμ„ λ•Œ, λΆ€λΆ„ μˆ˜μ—΄μ€ A : { 10, 20, 10, 30, 20, 50 } 이고, μ΅œλŒ€ κΈΈμ΄λŠ” 4이닀.

 

풀이

 

Dynamic Programming으둜 ν’€μ–΄μ•Ό ν•˜λŠ” λ¬Έμ œμ΄λ‹€. 이전 문제λ₯Ό κ°€μ§€κ³  μž¬μ‚¬μš©ν•΄μ„œ ν’€μ–΄μ•Ό ν•œλ‹€.

 

풀이 1

λ°˜λ³΅λ¬Έμ„ λŒλ €μ£Όλ©΄μ„œ ν˜„μž¬ κ°’(i)이 이전 κ°’(j)보닀 크면,

dpμ—μ„œμ˜ ν˜„μž¬ μœ„μΉ˜(i)와 이전 μœ„μΉ˜(j)μ—μ„œ +1을 ν•΄μ€€ 카운트 κ°’κ³Ό λΉ„κ΅ν•˜μ—¬

더 큰 카운트 값을 ν˜„μž¬ μœ„μΉ˜(i)에 μ €μž₯ν•΄μ€€λ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ μ§€κΈˆκ» 카운트 ν–ˆλ˜ κ°’ 쀑 큰 값을 μ €μž₯ν•˜λ©΄μ„œ μˆ˜μ—΄μ˜ μ΅œλŒ“κ°’μ„ μ•Œ 수 μžˆλŠ” 것이닀.

μ΅œμ’…μœΌλ‘œ κ²°κ³Όλ₯Ό 좜λ ₯ν•  λ•Œ dp에 μ €μž₯λ˜μ–΄ μžˆλŠ” κ°’μ—μ„œ μ΅œλŒ“κ°’μ„ 좜λ ₯ν•œλ‹€.

 

풀이 2

ν˜„μž¬ 값이(i)이 이전 κ°’(j)보닀 ν¬λ©΄μ„œ, dpμ—μ„œμ˜ ν˜„μž¬ μœ„μΉ˜(i)κ°€ 이전 μœ„μΉ˜(j)보닀 카운트 μˆ˜κ°€ μž‘μœΌλ©΄

이전 μœ„μΉ˜(j)의 카운트 값을 ν˜„μž¬ μœ„μΉ˜(i)에 μ €μž₯ν•œλ‹€.

이전 μœ„μΉ˜μ™€μ˜ 비ꡐ가 λλ‚¬μœΌλ©΄ ν˜„μž¬ μœ„μΉ˜(i)에 +1을 ν•΄μ£Όλ©° countν•΄μ€€λ‹€.

 

사싀 κΈ€λ‘œλ§Œ 보면 이해가 잘 μ•ˆ κ°€κΈ° λ•Œλ¬Έμ— μ½”λ“œ ν•œ 쀄 ν•œ 쀄에 λ³€μˆ˜λ₯Ό λ„£μ–΄κ°€λ©° ν’€μ–΄λ³΄λŠ” 것이 쒋을 것 κ°™λ‹€. 

Solution

풀이 1

import sys
input = sys.stdin.readline

N = int(input())
num = list(map(int, input().split()))
dp = [1]*N

for i in range(N):
    for j in range(i):
        if num[i] > num[j]:
            dp[i] = max(dp[i], dp[j]+1)
print(max(dp))

풀이 2

import sys
input = sys.stdin.readline

N = int(input())
num = list(map(int, input().split()))
dp = [0]*N

for i in range(N):
    for j in range(i):
        if num[i] > num[j] and dp[i] < dp[j]:
            dp[i] = dp[j]
    dp[i] += 1
print(max(dp))
728x90