1. ๋ฌธ์ ์ค๋ช ๐
๋ฌธ์ ์ค๋ช ์ด ๊ฝค ์ง๊ด์ ์ด๋ค. ๋ค๋ง ๋ด๊ฐ ํ ๋ฒ์ ์ดํดํ์ง ๋ชปํ ๋ถ๋ถ์ด ์์ด, ๊ทธ์ ๋ํ ๋ถ์ฐ ์ค๋ช ์ ํ๊ณ ๋ค์ ์ฅ์ผ๋ก ๋์ด๊ฐ๊ฒ ๋ค.
๊ต์ค์ด๋ i๋ฒ ๊ณต์ฅ์์ ์ ํํ๊ฒ Ai๊ฐ์ ๋ผ๋ฉด์ ๊ตฌ๋งคํ๊ณ ์ ํ๋ค(1 ≤ i ≤ N).
๋ฌธ์ ์ ์
๋ ฅ์ผ๋ก ์ผ๋ จ์ ๋ฐ์ดํฐ๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋๋ฐ, ํด๋น ๋ฐ์ดํฐ์ index = ๊ณต์ฅ
, value = ํด๋น ๊ณต์ฅ์์ ์ฌ์ผํ ๋ผ๋ฉด์ ๊ฐ์
๋ผ๋ ๋ป์ด๋ค.
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: DP
(๊ฐ) ๋ฌธ์ ์์ ์ฃผ์ด์ง 3๊ฐ์ง ๋ฐฉ๋ฒ์ ์์งํ๋ค.
- i๋ฒ ๊ณต์ฅ์์ ๋ผ๋ฉด์ ํ๋ ๊ตฌ๋งคํ๋ค(1 ≤ i ≤ N). ์ด ๊ฒฝ์ฐ ๋น์ฉ์ 3์์ด ๋ ๋ค.
- i๋ฒ ๊ณต์ฅ๊ณผ (i+1)๋ฒ ๊ณต์ฅ์์ ๊ฐ๊ฐ ๋ผ๋ฉด์ ํ๋์ฉ ๊ตฌ๋งคํ๋ค(1 ≤ i ≤ N-1). ์ด ๊ฒฝ์ฐ ๋น์ฉ์ 5์์ด ๋ ๋ค.
- i๋ฒ ๊ณต์ฅ๊ณผ (i+1)๋ฒ ๊ณต์ฅ, (i+2)๋ฒ ๊ณต์ฅ์์ ๊ฐ๊ฐ ๋ผ๋ฉด์ ํ๋์ฉ ๊ตฌ๋งคํ๋ค(1 ≤ i ≤ N-2). ์ด ๊ฒฝ์ฐ ๋น์ฉ์ 7์์ด ๋ ๋ค.
(๋) ์์์ ์ด ๋๋ i ๋ฒ์งธ ๊ณต์ฅ์์๋, ๋ฌด์จ ๋ฐฉ๋ฒ์ ํํ๋ 3
์ ๋น์ฉ์ด ๋ ๋ค. ๋ฐ๋ผ์ i๋ฒ์งธ ๊ณต์ฅ์ ๋ชจ๋ ๋ผ๋ฉด ๊ฐ์ * 3์ ๋ต์ ๋ํ๋ค. i๋ฒ์งธ ๊ณต์ฅ์ ๋ผ๋ฉด์ ์ ๋ถ ์ฒ๋ฆฌํ์์ผ๋ก arr[i] = 0์ด ๋๋ค.
(๋ค) i + 1 ๋ฒ์งธ ๊ณต์ฅ์ ๋ผ๋ฉด์, ์ต๋ i๋ฒ์งธ ๊ณต์ฅ ๋ผ๋ฉด์ ๊ฐ์ ๋งํผ ๋น์ฉ 2
์ ์ฒ๋ฆฌํ ์ ์๋ค. (์ฐ์๋๋ฏ๋ก)
๋ฐ๋ผ์ Math.min(i๋ฒ์งธ ๊ณต์ฅ ๋ผ๋ฉด์ ๊ฐ์, i+1๋ฒ์งธ ๊ณต์ฅ ๋ผ๋ฉด์ ๊ฐ์)
๋งํผ ๋น์ฉ 2์ ์ฒ๋ฆฌํ๋ค.
์ดํ, ์์ฌ ๋ผ๋ฉด์ arr[i+1]์ ์ ์ฅํ๋ค.
(๋ผ) i+2 ๋ฒ์งธ ๊ณต์ฅ์ ๋ผ๋ฉด์ Math.min(i๋ฒ์งธ ๊ณต์ฅ ๋ผ๋ฉด์ ๊ฐ์, i+2๋ฒ์งธ ๊ณต์ฅ์์ i+1๋ฒ์งธ ๊ณต์ฅ ์์ฌ ๋ผ๋ฉด์ ๊ฐ์๋ฅผ ์ ์ธํ ๋ผ๋ฉด์ ๊ฐ์)
๋งํผ ๋น์ฉ 2
์ ์ฒ๋ฆฌํ๋ค.
์ดํ ์์ฌ ๋ผ๋ฉด์ arr[i+2]์ ์ ์ฅํ๋ค.
(๋ง) 1๋ฒ๋ถํฐ 3๋ฒ๊น์ง๋ฅผ ๋ง์ง๋ง ๊ณต์ฅ์ด i์ ์ฌ๋๊น์ง ๋ฐ๋ณตํ๋ค.
์ค๋ช ๋ณด๋ค ๊ฒฐ๋ก ์ด ๋จผ์ ๋์ค๋ ๊ฒ ์ดํด์ ๋์์ด ๋ ๊ฒ ๊ฐ์์ ๋ฏธ๋ฆฌ ์ ์ฒด ๊ณผ์ ์ ๋ณด์ฌ์คฌ๋ค. ์๋ง (3)๋ฒ ๊ณผ์ ์ ๋ํ ์ค๋ช ์ด ํ์ํ ํ ๋ฐ, ์ง๊ธ๋ถํฐ ์ค๋ช ํ๊ฒ ๋ค.
(0) ๋ผ๋ฉด ์๋น๋ฅผ ๋ฐ๋ผ๋ณด๋ ๊ด์ ์ ํ (ํก โ ๊ฐ๋ณ) ๐ญ
๋ง์ ์ฌ๋๋ค์ด ๋ผ๋ฉด ์๋น์ ๊ด์ ์ ๋ฌธ์ ์ ์ฃผ์ด์ง ์กฐ๊ฑด์ฒ๋ผ ํก์ผ๋ก ๋ฐ๋ผ๋ณผ ๊ฒ์ด๋ค. (์ ๊ฐ๋ก3์นธ = 7, ๊ฐ๋ก 2์นธ = 5, ๊ฐ๋ก 1์นธ = 3)
ํ์ง๋ง ๊ณ ๋ง๊ฒ๋, 3๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋, ์์์ ์ ๋ผ๋ฉด ์๋น ๋น์ฉ์ 3์ด๊ณ , ์ฐ์๋ ๋ผ๋ฉด ์๋น๋ ๋น์ฉ์ด 2์ด๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ํ์ฌ ์กฐํ ์ค์ธ ๊ณต์ฅ์ ๋ผ๋ฉด ํ๋ ํ๋๋ฅผ ๋น์ฉ 3, i+1, i+2๋ฒ์งธ ๊ณต์ฅ์ ์ฐ์๋๋ ๋ผ๋ฉด์ ๋น์ฉ์ 2๋ผ๋ ๊ฐ๋ณ์ ์ธ ๊ด์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ ๊ทผํ๊ฒ ๋ค.
(1) ์ด๋ฌ๋ฉด ์ฌ์ด ๋ฌธ์ ์๋๊ฐ? ๐ค
์ด๋ ๊ฒ ์๊ฐ์ ๋ฐ๊พธ๋ฉด ๋ฌธ์ ๊ฐ ๊ต์ฅํ ์ฌ์๋ณด์ธ๋ค. ๋ค์ 3๊ฐ์ง ๊ท์น์ ์งํค๋ฉด ๋๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ฌ ์กฐํ ์ค์ธ ๊ณต์ฅ์ i
๋ผ๊ณ ํ ๋,
i
๋ฒ์งธ ๊ณต์ฅ์ ๋ผ๋ฉด๋ค์ 3๊ฐ์ง ๋ฐฉ๋ฒ ์ค ๋ญ ์ฌ์ฉํด๋ ๋น์ฉ์ด 3์ด๋ฏ๋ก ์ด ๋น์ฉ์i ๊ณต์ฅ ๋ผ๋ฉด์ ๊ฐ์ * 3
์ ๋ํ๋ค.
(์ ๋ถ ์ฌ์ฉ)i+1
๊ณผi+2
๊ณต์ฅ์ ๋ผ๋ฉด๋ค์ i๋ฒ์งธ ๊ณต์ฅ๊ณผ ์ฐ์๋ ๋งํผ๋ง ๋น์ฉ์ด 2์ด๋ฏ๋ก, ์ฐ์๋ ๋ชจ๋ ๊ฒ์ ์ ๋ถ ๋น์ฉ 2๋ก ์ด ๋น์ฉ์ ๋ํ๋ค.i
๋ฒ์งธ ๊ณต์ฅ์ ๋ผ๋ฉด์ ์ ๋ถ ์๋นํ์์ผ๋ก,i+1
์ ํ์ฌ ์กฐํ ์ค์ธ ๊ณต์ฅ์ ์ฎ๊ธฐ๊ณ ๋ค์ ์ฒ์๋ถํฐ ์์ํ๋ค. (์์ฌ ๋ผ๋ฉด์ ๋ํด์ ๋ฐ๋ณต)
ํ์ง๋ง ํด๋น ํ์ด๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐ๋ก๊ฐ ์๊ธด๋ค.
(2) ๋ฐ๋ก
์์ ์์๋ฅผ ์์์ ์ค๋ช ํ ๋ฐฉ๋ฒ๋๋ก ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋๋ค.
์ต๋ 3์นธ๋ถํฐ ํ์ธ ํ๋ฏ๋ก 3์นธ์ฉ 2๊ฐ ์ด ๋น์ฉ 14๋ฅผ ๋จผ์ ์ฒดํฌํ๊ณ , ๋๋จธ์ง ๋ฑ๊ฐ 2๊ฐ๋ฅผ ํ์ธํด์ ์ด ๋น์ฉ์ 20์ด ๋๋ค. ํ์ง๋ง ์ด๊ฒ์ ์ต์ ๋น์ฉ์ด ์๋๋ค. ์ต์ ๋น์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
0๋ฒ ๊ณต์ฅ์์ 3๋ฒ์งธ ๋ฐฉ๋ฒ์ 2๋ฒ ์ฌ์ฉํด์ ๋น์ฉ 14๋ก ๊ณ์ฐํ์ง ๋ง๊ณ 3๋ฒ์งธ ๋ฐฉ๋ฒ, 2๋ฒ์งธ ๋ฐฉ๋ฒ์ ๋ฒ๊ฐ์ ์จ์ ๋น์ฉ 12๋ฅผ ์ฌ์ฉํ ๋ค์, ๋๋จธ์ง ๋จ์ 3๊ฐ์ ๋ผ๋ฉด์ด ์ฐ์๋จ์ ์ด์ฉํด ๋ฐฉ๋ฒ 3์ผ๋ก ๋น์ฉ 7์ ๊ณ์ฐํ๋ ๊ฒ์ด๋ค. ์ด๋ฌ๋ฉด ๋น์ฉ์ด ์ด 19๊ฐ ๋ค์ด์ ์ต์ ๋น์ฉ์ด ๋๋ค.
์ด์ ๊ฐ์ด ๋ฌด์์ ๋ฐฉ๋ฒ 3 โ ๋ฐฉ๋ฒ 2 โ ๋ฐฉ๋ฒ 1์ ์ฐ์ ์์๋ก ํ๋ ๋น์ฉ ๊ณ์ฐ์๋ ํ์ ์ด ์กด์ฌํ๋ค. ๋ฐ๋ผ์ *์ ๊ทผ๋ฐฉ์์ (๋ผ) *์ ๊ฐ์ ํญ๋ชฉ์ด ํ์ํ ๊ฒ์ด๋ค.
(3) (๋ผ)๋ฒ์ ๋ํ ์ดํด (๋ฐ๋ก์ ๋ํ ๋์)
์ ๋ฌํ ๋ฐ๋ก๋ ์ ์๊ธฐ๋ ๊ฑธ๊น?
์ด์ ๋ i+1
๋ฒ์งธ์ ์์ฌ ๋ผ๋ฉด์ด ๋จ์ ์๋ค๋ฉด, i+2
,i+3
๋ฒ์งธ์ ํจ๊ป ๋ฐฉ๋ฒ3(์ฐ์ 3๊ฐ, ๋น์ฉ 7)์ด ์ฑ๋ฆฝํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ด์ ๋ํ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ค.
๊ทธ ๊ฒฐ๊ณผ *i+2
๋ฒ์งธ์์๋ ํญ์ i+1
๋ฒ์งธ์ ์์ฌ ๋ผ๋ฉด๋ ๋งํผ์ ๋ฏธ๋๋ฅผ ์ผ๋ํ์ฌ ํ ๊ณ์ฐ์์ ์ ์ธํ์ฌ์ผ ํ๋ค. *
์ฐ๋ฆฌ ๋ฐฉ์๋๋ก ํ๋ฉด i+1
๋ฒ์งธ๋ฅผ ๊ณ์ฐํ๋ ์์ ์์, i+1
๋ฒ์งธ์ ์์ฌ๋์ ์๊ฒ ๋๋ค. ๊ทธ ๋งํผ์ i+2
๋ฒ์งธ ๊ณ์ฐ์์ ์ ์ธํ๋ค. ์ ๊ทธ๋ฆผ์์๋ 1๊ฐ๊ฐ ๋จ์์ผ๋ก i+2๋ฒ์งธ์์ 1๊ฐ ์ ์ธ ํ ๋๋จธ์ง 1๊ฐ์ ๋ํด์๋ง ๋น์ฉ 2๋ก ์ฒ๋ฆฌํ๊ณ , ๋ค์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋์ด๊ฐ๋ค.
(4) ๊ผฌ๋ฆฌ ์ง๋ฌธ, ๋ง์ฝ i+3
์ ๊ฐ์ด 0์ด๋ฉด ๊ณ์ฐ์ ์ฐจ์ง์ด ์๊ธฐ์ง ์๋์?
์ฐจ์ง์ ์๊ธฐ์ง ์๋๋ค. ์๋ํ๋ฉด, i+3
์ ๊ฐ์ด 0์ผ ๊ฒฝ์ฐ, i+2
๋ฒ์งธ์ ์์ฌ ๋ผ๋ฉด์ ํ์ ๊ณ์ฐํ๋ ํ ๊ณ์ฐ์ ํฌํจํ์ฌ ๊ณ์ฐํ๋ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
3. ์ฝ๋ ์๊ฐ ๐
(1) Sudo Code
// ์
๋ ฅ
N (๊ณต์ฅ์ ๊ฐ์)
arr (๊ณต์ฅ์์ ๊ตฌ๋งคํด์ผํ ๋ผ๋ฉด์ ๊ฐ์)
while(index๊ฐ N๋ณด๋ค ์์ ๋ ๊น์ง) {
index๋ฒ ๊ณต์ฅ์ ๋ผ๋ฉด์ ๋ชจ๋ ๋น์ฉ 3์ผ๋ก ํ ๋งค์
index + 1๋ฒ ๊ณต์ฅ์์๋ ์ต๋ index ๊ณต์ฅ์์ ์๋นํ ๋ผ๋ฉด ๋งํผ ๋น์ฉ 2๋ก ๋งค์
index + 1๋ฒ ๊ณต์ฅ์ ์์ฌ ๋ผ๋ฉด ๊ธฐ๋ก
index + 2๋ฒ ๊ณต์ฅ์์๋ index+1๋ฒ์ ์์ฌ๋ผ๋ฉด๋งํผ ๋ฏธ๋ฆฌ ๋นผ๋๊ณ , ๋๋จธ์ง ๋ถ๋ถ์ ๋ํด์ ๋น์ฉ 2์ ๋งค์
(์ด ๋ 2์ ๋งค์ํ๋ ๋ถ๋ถ์ด index ๋ฒ ๊ณต์ฅ์์ ๋งค์ํ ๋ผ๋ฉด ๊ฐ์๋ฅผ ๋์ผ๋ฉด ์๋๋ค.)
}
์ ๋ต ์ถ๋ ฅ
(2) ๊ตฌํ ์ฝ๋
public class Main {
/*
* b18185 ๋ผ๋ฉด ์ฌ๊ธฐ (small)
* 0. ๋คํํ ๋ฌธ์ ์์ ์ ์ํ (3์นธ = 7๊ฐ, 2์นธ = 5๊ฐ, 1์นธ = 3)์ ๋น์ฉ ์กฐ๊ฑด์ ๋ชจ๋ ์นธ์ ๋ถ๋ฆฌํด์ ์๊ฐํด๋
* ๋น์ฉ ์กฐ๊ฑด ๋ณ๋ก ๋ฌถ์ด์ ๊ณ์ฐํ ๊ฒฝ์ฐ์ ์ฐจ์ด๊ฐ ์๋ค. (์ด ์ ์ ์ด์ฉํด ๋ชจ๋ ์นธ์ ๋ถ๋ฆฌํด์ ์๊ฐํ๋ค.)
*
* 1. ํ์ฌ ์กฐํ ์ค์ธ ๊ณต์ฅ์ i๋ผ๊ณ ํ ๋, i ๊ณต์ฅ์์ ๋ ์ ์๋ ํ ๋ง์ด ์ฌ๊ฐ๋ค. max*3;
*
* 2. i+1๊ณผ i+2 ๊ณต์ฅ์ ๊ฒฝ์ฐ, i์ ๋ผ๋ฉด ๊ฐ์ ๋งํผ ์ด์ด์ ธ ์๋ ๊ฒ์ด๋ค.
* ๋ฐ๋ผ์ i์ ๋ผ๋ฉด ๊ฐ์๋งํผ ์ต๋ํ ๊ฐ์ ธ๊ฐ๋ค. (๊ฐ ๊ณต์ฅ ๋ณ ๋ผ๋ฉด ๊ฐ์ * 2)
*
* 3. ๋ค๋ง 1211์ฒ๋ผ (0101 -> 0001 -> 0000)์ด ๋๋ ๊ฒ๋ณด๋ค, (0111 -> 0000) ์ด ๋๋ ๊ฒ์ด ๋น์ฉ์ด ๋ ์ ์ ์ ์์
* ๋ฐ๋ผ์ 2๋ฒ์์ ๋ฌด์์ (์กฐ๊ฑด 3 ์ต๋ํ ๋ง์ด -> ์กฐ๊ฑด 2 ์ต๋ํ ๋ง์ด) ๋ก ์ด์ด์ ธ์๋ ์๋๋ค.
*
* ๋ฐ๋ผ์ i, i+1, i+2 ๊ด๊ณ์์ i+1๋ฒ์ ๋ผ๋ฉด ๊ฐ์๊ฐ i+2๋ณด๋ค ํด ๊ฒฝ์ฐ,
* 2๋ฒ ์กฐ๊ฑด์ผ๋ก ํ์ ๋, ๋จ์์์ i+1 ์ ์์ฌ ๋ผ๋ฉด๋ ๋งํผ i+2์ ๋ผ๋ฉด๋ ์ด๋ ค๋๋ค.
* ๋ง์ฝ i + 3์ ๋ผ๋ฉด์ด ์๋ค๋ฉด i+1๋ถํฐ ์กฐ๊ฑด 3์ ์ฌ์ฉํ๋ฉด ๋๋ฏ๋ก ์ต์ ์ ํจ์จ์ ๋ธ๋ค.
* i+3 ๊ณต์ฅ์ ๋ผ๋ฉด ๊ฐ์๊ฐ 0์ด๋๋ผ๋, ๋จ์ ๋ผ๋ฉด์ ์กฐ๊ฑด 2๋ก ์ธ๋ฉด, ์กฐ๊ฑด 3๋ถํฐ Greedy ํ ๊ฒ๊ณผ ๋น์ฉ์ด ๋์ผ
*
* */
public static void main(String[] args) throws IOException {
int ans = 0;
int N;
int [] arr;
int idx = 0;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int [N+2];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
while (idx < N) {
int first_consume = arr[idx];
int sec_consume = 0;
int third_consume = 0;
if(first_consume > 0) {
ans += first_consume*3;
arr[idx] = 0;
sec_consume = Math.min(first_consume, arr[idx+1]);
if(sec_consume == 0) continue;
ans += sec_consume*2;
arr[idx+1] -= sec_consume;
// ํ ์์ ์์ 3๋ฒ์งธ ์นธ์ ์ผ๋ง๋ ์๋นํ ์ง.
// - ์ฒซ๋ฒ์งธ ๋ผ๋ฉด์๋งํผ(Maximum),
// - ๋๋ฒ์งธ ๋จ์ ๋ผ๋ฉด๋๋งํผ ๋จ๊ธฐ๊ณ ์ ๋ถ ์๋น
// - ๋๋ฒ์งธ ๋จ์ ๋ผ๋ฉด๋์ด 3๋ฒ์งธ ๋ผ๋ฉด๋์ ์ด๊ณผํ๋ฉด, ์๋ฌด๊ฒ๋ ์๋นํ์ง ์์.
third_consume = Math.min(sec_consume, arr[idx+2] - Math.min(arr[idx+1],arr[idx+2]));
ans += third_consume*2;
arr[idx+2] -= third_consume;
}
idx++;
}
System.out.println(ans);
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
๋ค์ด์ ์๊ฐ๋ณด๋ค ํ ๋ง ํ๋ฐ?