파이썬 μ•Œκ³ λ¦¬μ¦˜

[μ΄μ½”ν…Œ Ch16-33] 퇴사

은진 2022. 4. 19. 20:51

πŸ‘©πŸ»β€πŸ’»λ¬Έμ œμ„€λͺ…

[μ΄μ½”ν…Œ Ch16-33] 퇴사
μ΄μ½”ν…Œ

✍️Idea Sketch

λ¬Έμ œμš”μ•½

남은 N일 λ™μ•ˆ μ΅œλŒ€ν•œ λ§Žμ€ 상담을 ν•˜λ €κ³  ν•œλ‹€. 상담을 μ™„λ£Œν•˜λŠ”λ° κ±Έλ¦¬λŠ” κΈ°κ°„ Ti와 상담을 ν–ˆμ„ λ•Œ 받을 수 μžˆλŠ” κΈˆμ•‘ Pi둜 이루어져 μžˆλ‹€. 퇴사 전에 ν•  수 μžˆλŠ” μƒλ‹΄μ˜ μ΅œλŒ€ 이읡을 κ΅¬ν•˜λΌ.


μ‹œκ°„λ³΅μž‘λ„

O(2^n)

각 λ‚ μ§œλ§ˆλ‹€ 상담을 ν•˜λŠ” 경우, 그렇지 μ•Šμ€ 경우 총 2가지λ₯Ό κ³ λ €ν•œλ‹€. 2 * 2 * 2 * … 총 n번 κ³±ν•˜λ―€λ‘œ 2^n이닀.


μ•Œκ³ λ¦¬μ¦˜ : 브루트포슀 μ•Œκ³ λ¦¬μ¦˜, λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°

브루트포슀 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ κ΅¬ν˜„ν–ˆλ‹€. DFS둜 상담을 ν•˜λŠ” κ²½μš°μ™€ 그렇지 μ•ŠλŠ” 경우 λ‘˜ λ‹€ ν•¨μˆ˜ ν˜ΈμΆœν–ˆλ‹€. 그리고 μ •ν™•νžˆ ν‡΄μ‚¬λ‚ μ§œμ— λ„λ‹¬ν•œ 경우, μ΅œλŒ€ 이읡을 κ³„μ‚°ν•œλ‹€.


βœοΈλ‚΄ μ†ŒμŠ€μ½”λ“œ

  • μ’…λ£Œμ‘°κ±΄ : μ •ν™•νžˆ ν‡΄μ‚¬λ‚ μ§œ n에 λ„λ‹¬ν•œ 경우, μ΅œλŒ€ 이읡을 κ³„μ‚°ν•œλ‹€.
  • n+1일째 μ΄ν›„λΆ€ν„°λŠ” νšŒμ‚¬μ— μ—†κΈ° λ•Œλ¬Έμ—, μ΅œλŒ€ 이읡을 ꡬ할 수 μ—†λ‹€. λ”°λΌμ„œ depthκ°€ n을 μ΄ˆκ³Όν•˜λŠ” 경우 μ΅œλŒ€ 이읡을 κ³„μ‚°ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • depth의 λ‚ μ§œμ— 상담을 ν•˜λŠ” κ²½μš°μ™€ 그렇지 μ•Šμ€ 경우 λ‘˜ λ‹€ dfs ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.


전체 μ½”λ“œ

    import sys
    si = sys.stdin.readline


    def dfs(depth, price):
        global max_price
        if depth == n:
            max_price = max(max_price, price)
            return

        if depth > n:
            return

        t, p = seq[depth]
        dfs(depth + t, price + p)
        dfs(depth + 1, price)


    if __name__ == "__main__":
        n = int(si())
        seq = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]

        max_price = 0
        dfs(0, 0)
        print(max_price)