๐Ÿ”‘ CS/์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[๋ฐฑ์ค€ 2579๋ฒˆ] ๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ (python/ํŒŒ์ด์ฌ)

๋ณต๋งŒ 2022. 9. 15. 17:24

DFS๋กœ ํ’€์—ˆ๋‹ค๊ฐ€ ์‹คํŒจํ•˜๊ณ  DP๋กœ ์„ฑ๊ณต

์‹ค๋ฒ„ 3 ์ ˆ๋Œ€์•„๋‹˜

 

๐ŸŒผ ๋ฌธ์ œ ๋งํฌ

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

 

2579๋ฒˆ: ๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ

๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ ๊ฒŒ์ž„์€ ๊ณ„๋‹จ ์•„๋ž˜ ์‹œ์ž‘์ ๋ถ€ํ„ฐ ๊ณ„๋‹จ ๊ผญ๋Œ€๊ธฐ์— ์œ„์น˜ํ•œ ๋„์ฐฉ์ ๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒŒ์ž„์ด๋‹ค. <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ™์ด ๊ฐ๊ฐ์˜ ๊ณ„๋‹จ์—๋Š” ์ผ์ •ํ•œ ์ ์ˆ˜๊ฐ€ ์“ฐ์—ฌ ์žˆ๋Š”๋ฐ ๊ณ„๋‹จ์„ ๋ฐŸ์œผ๋ฉด ๊ทธ ๊ณ„๋‹จ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ 

www.acmicpc.net

  • ํ‹ฐ์–ด:  ์‹ค๋ฒ„ III
  • ๋ถ„๋ฅ˜: ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

 

 

โ— TRIAL 1.

๋”๋ณด๊ธฐ
์ฝ”๋“œ
import sys
input = sys.stdin.readline

def dfs(stairs, val, ctr):
    if not stairs:
        return val
    next_val = stairs.pop()
    if ctr != 2:
        dfs1 = dfs(stairs, val+next_val, ctr+1)
        dfs0 = dfs(stairs, val, 0)
        stairs.append(next_val)
        return max(dfs1, dfs0)
    else:
        dfs0 = dfs(stairs, val, 0)
        stairs.append(next_val)
        return dfs0

N = int(input())
stairs = []
for _ in range(N):
    stairs.append(int(input()))

val = stairs.pop()
print(dfs(stairs, val, 1))

 

์ฝ”๋“œ ์„ค๋ช…

 

- ์—ฐ์†์œผ๋กœ ๋ช‡๊ฐœ์˜ ๊ณ„๋‹จ์„ ๋ฐŸ์•˜๋Š”์ง€๋ฅผ ์„ธ๋Š” ctr์„ dfs์— ํ•จ๊ป˜ ์ „๋‹ฌํ•จ

- ๋งŒ์•ฝ ctr์ด 2์ด๋ฉด, ๋‹ค์Œ ๊ณ„๋‹จ์€ ๋ฐŸ์ง€ ์•Š์Œ. ctr์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”

- ctr์ด 2๊ฐ€ ์•„๋‹ˆ๋ฉด, ๋‹ค์Œ ๊ณ„๋‹จ์„ ๋ฐŸ๋Š” ๊ฒฝ์šฐ์™€ ๋ฐŸ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ค‘ ํฐ ๊ฐ’์„ ์ด์šฉ. ๋‹ค์Œ ๊ณ„๋‹จ์„ ๋ฐŸ๋Š” ๊ฒฝ์šฐ ctr์— 1 ์ถ”๊ฐ€

 

ํ‹€๋ฆฐ ์›์ธ

 

์‹œ๊ฐ„์ดˆ๊ณผDFS๋กœ ํ’€๋ฉด ๊ฑฐ์˜ binary tree์™€ ๋น„์Šทํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(N^2) ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. (๊ตฌํ˜„์€ ์ œ์ผ ๊ฐ„๋‹จ)

 

 

โ— TRIAL 2.

๋”๋ณด๊ธฐ
์ฝ”๋“œ
import sys
input = sys.stdin.readline

N = int(input())
stairs = []
for _ in range(N):
    stairs.append(int(input()))

d0 = [0] * N
d1 = [0] * N
dmax = [0] * N

d0[0], d1[0] = stairs[0], stairs[0]
d0[1], d1[1] = stairs[1], stairs[0]+stairs[1]
dmax[0] = max(d0[0], d1[0])
dmax[1] = max(d0[1], d1[1])

for i in range(2, N):
    d0[i] = dmax[i-2] + stairs[i]
    d1[i] = d0[i-1] + stairs[i]
    dmax[i] = max(d0[i], d1[i])

print(dmax[N-1])

 

์ˆ˜์ •ํ•œ ๋ถ€๋ถ„

 

- DFS bottom-up ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •

- ์ด์ „ ๊ณ„๋‹จ์„ ๋ฐŸ์€ ๊ฒฝ์šฐ์ธ d0, ์ด์ „ ๊ณ„๋‹จ์„ ๋ฐŸ์ง€ ์•Š์€ ๊ฒฝ์šฐ์ธ d1, ๋‘ ๊ฒฝ์šฐ์˜ ์ตœ๋Œ“๊ฐ’์ธ dmax ์„ธ ๊ฐœ์˜ array๋ฅผ ๊ณ„์‚ฐํ•จ

- d0์„ ๊ณ„์‚ฐํ• ๋•Œ๋Š” ๋‘์นธ ์ „์˜ dmax๊ฐ’์— ํ˜„์žฌ ๊ณ„๋‹จ ๊ฐ’์„ ๋”ํ•จ

- d1์„ ๊ณ„์‚ฐํ• ๋•Œ๋Š” ํ•œ์นธ ์ „์˜ d0๊ฐ’์— ํ˜„์žฌ ๊ณ„๋‹จ ๊ฐ’์„ ๋”ํ•จ

- d0๊ณผ d1์„ ๊ณ„์‚ฐํ•œ ํ›„ dmax ๊ฐ’์„ ๊ณ„์‚ฐ

 

ํ‹€๋ฆฐ ์›์ธ

 

Runtime error. ๊ณ„๋‹จ์ด ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ ค ๋ชปํ•จ

 

๐Ÿ’ก Solution

์ฝ”๋“œ
import sys
input = sys.stdin.readline

N = int(input())
stairs = [0]
for _ in range(N):
    stairs.append(int(input()))

d0 = [0] * (N+1)
d1 = [0] * (N+1)
dmax = [0] * (N+1)

d0[1], d1[1] = stairs[1], stairs[1]
dmax[1] = max(d0[1], d1[1])

for i in range(2, N+1):
    d0[i] = dmax[i-2] + stairs[i]
    d1[i] = d0[i-1] + stairs[i]
    dmax[i] = max(d0[i], d1[i])

print(dmax[N])

 

์ฝ”๋“œ ์„ค๋ช…
  • DFS bottom-up
  • ์ด์ „ ๊ณ„๋‹จ์„ ๋ฐŸ์€ ๊ฒฝ์šฐ์ธ d0, ์ด์ „ ๊ณ„๋‹จ์„ ๋ฐŸ์ง€ ์•Š์€ ๊ฒฝ์šฐ์ธ d1, ๋‘ ๊ฒฝ์šฐ์˜ ์ตœ๋Œ“๊ฐ’์ธ dmax ์„ธ ๊ฐœ์˜ array๋ฅผ ๊ณ„์‚ฐํ•จ
  • d0์„ ๊ณ„์‚ฐํ• ๋•Œ๋Š” ๋‘์นธ ์ „์˜ dmax๊ฐ’์— ํ˜„์žฌ ๊ณ„๋‹จ ๊ฐ’์„ ๋”ํ•จ
  • d1์„ ๊ณ„์‚ฐํ• ๋•Œ๋Š” ํ•œ์นธ ์ „์˜ d0๊ฐ’์— ํ˜„์žฌ ๊ณ„๋‹จ ๊ฐ’์„ ๋”ํ•จ
  • d0๊ณผ d1์„ ๊ณ„์‚ฐํ•œ ํ›„ dmax ๊ฐ’์„ ๊ณ„์‚ฐ
  • ์‹œ์ž‘์œ„์น˜๋ฅผ 0์œผ๋กœ ์žก์Œ
    •  
๋ฐ˜์‘ํ˜•