๐ ๋ฌธ์ ์ฌ์ดํธ : https://www.acmicpc.net/problem/2342
์ด ๋ฌธ์ ๋ฅผ ์ฒ์ ํ ๋๋ greedy๋ก ๋ชจ๋ ๊ณณ์ ํ์ํ๋ฉด์ q์ ๊ฒฝ์ฐ์ ์๋ฅผ ๋๋ ค๊ฐ๋ฉด์ ํด๊ฒฐํ๋ ค๊ณ ํ์๋ค.
๊ทธ๋ ๊ฒ ํ์์ ๊ฒฝ์ฐ์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋ง์ด ํด์ฃผ์ด์ผ ๋๊ณ , step์ ๋๊ฐ์๋ฐ ๊ฐ๋ง ๋ค๋ฅธ ๊ฒ๋ค์ด ์ค๋ณต๋๋ ๊ฒ์ ํ์ธํ์์ผ๋ฉฐ, ๊ฒฐ๋ก ์ ์ผ๋ก ์๊ฐ ์ด๊ณผ๊ฐ ๋ฌ๋ค.
๊ทธ๋์ dp๋ฅผ ์ด์ฉํ์ฌ ํ๊ฒ ๋์๊ณ , 3์ค array๋ก dp๋ฅผ ๊ตฌ์ฑํ์ฌ bottom up ํ์์ผ๋ก ํ์๋ค.
instruction์ ์ต๋ ๊ฐ์๊ฐ 100000์ด๋ฏ๋ก, instruction ํ๋๋น 1๋ฒ,2๋ฒ,3๋ฒ,4๋ฒ์นธ๊ณผ ์ผ๋ฐ, ์ค๋ฅธ๋ฐ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์๊ฐํด๋ณด์๋ ์๊ฐ์ด๊ณผ์์ด ํด๊ฒฐํ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ์๋ค.
1) instruction์ ๋ง์ง๋ง์ 0์ด ์
๋ ฅ๋๋ฏ๋ก n ์ len(ins) - 1 ๋ก ๊ตฌ์ฑํ์ฌ 0์ ์ฐธ์กฐํ์ง ์๋๋ก ํด์ค๋ค.
2) move๋ผ๋ ํจ์๋ ๋ฌธ์ ์ ๊ตฌํ๋์ด ์๋ ์ด๋ํ ๋ ๋๋ ํ์ ๊ทธ๋๋ก ๊ตฌํํ๋ค.
3) ๋ชจ๋ instruction์ ๋ํ์ฌ bottom up์ผ๋ก dp๋ฅผ ์ฑ์๋๊ฐ๋ค.
๐ ํ์ฌ ์ฑ์์ ธ์๋ dp์ํ์ ์ ๋จ๊ณ(i-1)์์ ์ด๊ณณ์ผ๋ก ์ด๋ํด์์ ๋ ๊ฐ์ ๋น๊ตํ์ฌ ์์ ๊ฐ์ผ๋ก dp ๊ฐ์ ๋ค์ ์ ํด์ค๋ค.
(์ฒ์ ์ํ์์ i-1๋ก ์ฐธ์กฐํ์ ๋๋ฅผ ๋๋นํด ์์ ์ ์ dp[-1][0][0] = 0 ์ผ๋ก ์กฐ์น๋ฅผ ํด๋์์)
ins = list(map(int, input().split()))
n = len(ins)-1
dp = [[[400001 for _ in range(5)] for _ in range(5)] for _ in range(n+1)]
dp[-1][0][0] = 0
def move(start, end):
if start == 0:
if end == 0:
return 0
else:
return 2
if start == end:
return 1
elif abs(start - end) == 1 or abs(start - end) == 3:
return 3
else:
return 4
for i in range(n):
for current in range(5):
for start in range(5):
add = move(start, ins[i])
# ์ผ๋ฐ ์ด๋
dp[i][ins[i]][current] = min(dp[i][ins[i]][current], dp[i-1][start][current] + add)
# ์ค๋ฅธ๋ฐ ์ด๋
dp[i][current][ins[i]] = min(dp[i][current][ins[i]], dp[i-1][current][start] + add)
result = int(1e9)
for l in range(5):
for r in range(5):
result = min(result, dp[n-1][l][r])
print(result)