์•Œ๊ณ ๋ฆฌ์ฆ˜/DP

[๋ฐฑ์ค€ 17404 ๐Ÿฅ‡] RGB ๊ฑฐ๋ฆฌ2

1eehyunji 2023. 7. 27. 00:29

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

 

17404๋ฒˆ: RGB๊ฑฐ๋ฆฌ 2

์ฒซ์งธ ์ค„์— ์ง‘์˜ ์ˆ˜ N(2 ≤ N ≤ 1,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ์ง‘์„ ๋นจ๊ฐ•, ์ดˆ๋ก, ํŒŒ๋ž‘์œผ๋กœ ์น ํ•˜๋Š” ๋น„์šฉ์ด 1๋ฒˆ ์ง‘๋ถ€ํ„ฐ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. ์ง‘์„ ์น ํ•˜๋Š” ๋น„์šฉ์€ 1,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜

www.acmicpc.net

๋ฌธ์ œ

RGB๊ฑฐ๋ฆฌ์—๋Š” ์ง‘์ด N๊ฐœ ์žˆ๋‹ค. ๊ฑฐ๋ฆฌ๋Š” ์„ ๋ถ„์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ , 1๋ฒˆ ์ง‘๋ถ€ํ„ฐ N๋ฒˆ ์ง‘์ด ์ˆœ์„œ๋Œ€๋กœ ์žˆ๋‹ค.

์ง‘์€ ๋นจ๊ฐ•, ์ดˆ๋ก, ํŒŒ๋ž‘ ์ค‘ ํ•˜๋‚˜์˜ ์ƒ‰์œผ๋กœ ์น ํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ์ง‘์„ ๋นจ๊ฐ•, ์ดˆ๋ก, ํŒŒ๋ž‘์œผ๋กœ ์น ํ•˜๋Š” ๋น„์šฉ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์•„๋ž˜ ๊ทœ์น™์„ ๋งŒ์กฑํ•˜๋ฉด์„œ ๋ชจ๋“  ์ง‘์„ ์น ํ•˜๋Š” ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•ด๋ณด์ž.

  • 1๋ฒˆ ์ง‘์˜ ์ƒ‰์€ 2๋ฒˆ, N๋ฒˆ ์ง‘์˜ ์ƒ‰๊ณผ ๊ฐ™์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
  • N๋ฒˆ ์ง‘์˜ ์ƒ‰์€ N-1๋ฒˆ, 1๋ฒˆ ์ง‘์˜ ์ƒ‰๊ณผ ๊ฐ™์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
  • i(2 ≤ i ≤ N-1)๋ฒˆ ์ง‘์˜ ์ƒ‰์€ i-1, i+1๋ฒˆ ์ง‘์˜ ์ƒ‰๊ณผ ๊ฐ™์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ง‘์˜ ์ˆ˜ N(2 ≤ N ≤ 1,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ์ง‘์„ ๋นจ๊ฐ•, ์ดˆ๋ก, ํŒŒ๋ž‘์œผ๋กœ ์น ํ•˜๋Š” ๋น„์šฉ์ด 1๋ฒˆ ์ง‘๋ถ€ํ„ฐ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. ์ง‘์„ ์น ํ•˜๋Š” ๋น„์šฉ์€ 1,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ชจ๋“  ์ง‘์„ ์น ํ•˜๋Š” ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 
import sys
from collections import deque

n=int(sys.stdin.readline())
# ๋นจ๊ฐ• ์ดˆ๋ก ํŒŒ๋ž‘ ์น ํ•˜๋Š” ๋น„์šฉ
cost=[list(map(int, sys.stdin.readline().split(' '))) for _ in range(n)]

# ์‹œ๊ฐ„์ดˆ๊ณผ ์ฝ”๋“œ(bfs)
# 1๋ฒˆ ์ง‘์„ ๋นจ, ์ดˆ, ํŒŒ๋กœ ์น ํ•˜๋Š” ๊ฒฝ์šฐ
# ๋นจ=0, ์ดˆ=1, ํŒŒ=2
# minvalue=1e9
# for one in range(3):
#     # ์ปฌ๋Ÿฌ ๊ฐ’๊ณผ ๋น„์šฉ๊ณผ ์ธ๋ฑ์Šค ์ €์žฅ
#     queue=deque()
#     queue.append((one, cost[0][one], 0))
#     while queue:
#         cur_color, cur_cost, cur_idx =queue.popleft()
#         if cur_idx==n-1:
#             minvalue=min(cur_cost, minvalue)
#         elif cur_idx==n-2:
#             for new_color in range(3):
#                 if new_color!=one and new_color!=cur_color:
#                     queue.append((new_color, cur_cost+cost[cur_idx+1][new_color], cur_idx+1))
#         else:
#             for new_color in range(3):
#                 if new_color!=cur_color:
#                     queue.append((new_color, cur_cost+cost[cur_idx+1][new_color], cur_idx+1))
#
# print(minvalue)

# dp๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์–ด๋ณด์ž
# ๋นจ=0, ์ดˆ=1, ํŒŒ=2
ans=1e9
for i in range(3):
    dp=[[1e9, 1e9, 1e9] for _ in range(n)]
    dp[0][i]=cost[0][i]
    for j in range(1, n):
        dp[j][0]=cost[j][0]+min(dp[j-1][1], dp[j-1][2])
        dp[j][1]=cost[j][1]+min(dp[j-1][0], dp[j-1][2])
        dp[j][2]=cost[j][2]+min(dp[j-1][0], dp[j-1][1])
    for c in range(3):
        if c!=i:
            ans=min(ans, dp[n-1][c])

print(ans)

์ฒ˜์Œ์— BFS๋กœ ํ’€๊ธฐ๋ฅผ ์‹œ๋„ํ–ˆ๋‹ค๊ฐ€ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค..! ์ง‘์˜ ๊ฐœ์ˆ˜ N์ด ์ตœ๋Œ€ 1000๊ฐœ์ธ๋ฐ, ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ํƒ์ƒ‰ํ•˜๋ ค๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ์ˆ˜ ๋ฐ–์— ์—†๊ธด ํ–ˆ๋‹ค. 

 

๊ทธ๋ž˜์„œ DP๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์–ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค! ์ฒ˜์Œ์— DP๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ด ์–ด๋ ค์›Œ์„œ ํ—ค๋งธ๋‹ค.

 

์šฐ์„  dp ๋ฐฐ์—ด์— ์ฒซ๋ฒˆ์งธ ์ง‘์„ ๋นจ๊ฐ•(0), ์ดˆ๋ก(1), ํŒŒ๋ž‘(2)์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ for๋ฌธ์„ ์ด์šฉํ•ด์„œ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ํƒ์ƒ‰ํ•ด์ฃผ๊ณ , ์ฒซ ๋ฒˆ์งธ ์ง‘์„ ๊ฐ๊ฐ์˜ ์ƒ‰์œผ๋กœ ์„ค์ •ํ•œ ์ƒํƒœ์—์„œ i๋ฒˆ์งธ ์ง‘์„ ๋นจ๊ฐ•, ์ดˆ๋ก, ํŒŒ๋ž‘์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ๊ฐ์˜ ์ตœ์†Œ ๋น„์šฉ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ dp[n][3] ํฌ๊ธฐ์˜ 1e9๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ฐฐ์—ด๋กœ ์„ ์–ธํ–ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ , 2๋ฒˆ์งธ ์ง‘๋ถ€ํ„ฐ n๋ฒˆ์งธ ์ง‘๊นŒ์ง€ ํƒ์ƒ‰์„ ํ•ด์ค€๋‹ค. 

dp[j][0]์€ j๋ฒˆ์งธ ์ง‘์— ๋นจ๊ฐ•์ƒ‰์„ ์น ํ–ˆ์„ ๋•Œ์˜ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์šฐ์„ , cost[j][0]์— ์ €์žฅ๋œ ๋น„์šฉ์— j-1๋ฒˆ์งธ ์ง‘์— ์ดˆ๋ก์ƒ‰์„ ์น ํ•˜๊ฑฐ๋‚˜, ํŒŒ๋ž‘์ƒ‰์„ ์น ํ•˜๋Š” ๋น„์šฉ ์ค‘ ๋” ์ž‘์€ ๊ฐ’์„ ๋”ํ•ด์„œ dp[j][0]์— ์ €์žฅํ•œ๋‹ค. 

j๋ฅผ 1์—์„œ n-1๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ dp[][] ๋ฐฐ์—ด์— ์ตœ์†Œ ๋น„์šฉ์„ ์ €์žฅํ•œ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ , ๊ฐ€์žฅ ๋ฐ”๊นฅ for๋ฌธ ์ฆ‰, ์ฒซ๋ฒˆ์งธ ์ง‘์— ์–ด๋–ค ์ƒ‰์„ ์น ํ•  ๊ฒƒ์ธ์ง€ ๋ฐ˜๋ณตํ•˜๋Š” for๋ฌธ์ด ๋๋‚  ๋•Œ๋งˆ๋‹ค ์ฒซ๋ฒˆ์งธ ์ƒ‰๊ณผ ๋‹ค๋ฅธ ์ƒ‰์ด ์น ํ•ด์ง„ dp[n-1][c]์˜ ๊ฐ’ ์ค‘ ์ตœ์†Œ๊ฐ’์œผ๋กœ ans๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.