[Baekjoon/๐ฅSilverโ ฃ] 2839: ์คํ ๋ฐฐ๋ฌ
๐โโ๏ธ ์คํ ๋ฐฐ๋ฌ
์๊ทผ์ด๋ ์์ฆ ์คํ๊ณต์ฅ์์ ์คํ์ ๋ฐฐ๋ฌํ๊ณ ์๋ค. ์๊ทผ์ด๋ ์ง๊ธ ์ฌํ๊ฐ๊ฒ์ ์คํ์ ์ ํํ๊ฒ Nํฌ๋ก๊ทธ๋จ์ ๋ฐฐ๋ฌํด์ผ ํ๋ค. ์คํ๊ณต์ฅ์์ ๋ง๋๋ ์คํ์ ๋ด์ง์ ๋ด๊ฒจ์ ธ ์๋ค. ๋ด์ง๋ 3ํฌ๋ก๊ทธ๋จ ๋ด์ง์ 5ํฌ๋ก๊ทธ๋จ ๋ด์ง๊ฐ ์๋ค.
์๊ทผ์ด๋ ๊ท์ฐฎ๊ธฐ ๋๋ฌธ์, ์ต๋ํ ์ ์ ๋ด์ง๋ฅผ ๋ค๊ณ ๊ฐ๋ ค๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด, 18ํฌ๋ก๊ทธ๋จ ์คํ์ ๋ฐฐ๋ฌํด์ผ ํ ๋, 3ํฌ๋ก๊ทธ๋จ ๋ด์ง 6๊ฐ๋ฅผ ๊ฐ์ ธ๊ฐ๋ ๋์ง๋ง, 5ํฌ๋ก๊ทธ๋จ 3๊ฐ์ 3ํฌ๋ก๊ทธ๋จ 1๊ฐ๋ฅผ ๋ฐฐ๋ฌํ๋ฉด, ๋ ์ ์ ๊ฐ์์ ๋ด์ง๋ฅผ ๋ฐฐ๋ฌํ ์ ์๋ค.
์๊ทผ์ด๊ฐ ์คํ์ ์ ํํ๊ฒ Nํฌ๋ก๊ทธ๋จ ๋ฐฐ๋ฌํด์ผ ํ ๋, ๋ด์ง ๋ช ๊ฐ๋ฅผ ๊ฐ์ ธ๊ฐ๋ฉด ๋๋์ง ๊ทธ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐โโ๏ธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. (3 โค N โค 5000)
๐โโ๏ธ ์ถ๋ ฅ
์๊ทผ์ด๊ฐ ๋ฐฐ๋ฌํ๋ ๋ด์ง์ ์ต์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋ง์ฝ, ์ ํํ๊ฒ Nํฌ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์๋ค๋ฉด -1์ ์ถ๋ ฅํ๋ค.
๐ฉโ๐ป Algoritm: greedy
ํ์๋ ๊ฐ์ฅ ๋จผ์ ํ์๊ธฐ๋ฒ(greedy)์ ์ ์ฉํด ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋ค.
๋ด์ง์ ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋ก 5ํฌ๋ก๊ทธ๋จ์ ๋ด์ง๋ฅผ ์ต๋ํ ๋ง์ด ์ฐ๊ฒ ํด์ผ ํ๋ค.
๐ฉ ์๊ณ ๋ฆฌ์ฆ1: 5ํฌ๋ก๊ทธ๋จ ๋ด์ง ์ฌ์ฉ์ ์ต๋๋ฅผ ๊ตฌํ ํ ์ค์ฌ ๋๊ฐ๋ค.
N = int(input())
five = N//5 # 5ํฌ๋ก๊ทธ๋จ ๋ด์ง๋ฅผ ์ต๋๋ก ์ธ ๊ฒฝ์ฐ
for i in range(five, -1, -1): # 5ํฌ๋ก๊ทธ๋จ ๋ด์ง๋ฅผ ํ๋์ฉ ์ค์ฌ๊ฐ๋ค.
three = (N-(i*5))%3
if three == 0:
print(i+((N-(i*5))//3))
break
else:
print(-1)
๋ค๋ฅธ ์ฌ๋๋ค ํ์ด๋ฅผ ๋ณด๋ค ๋ณด๋ ๊ณตํต์ ์ธ ๋ฐฉ์์ผ๋ก ๊ทธ๋ฆฌ๋๋ฅผ ์ ์ฉํ๊ณ ์์ด ํด๋น ๋ฌธ์ ํ์ด๋ ์ ๋ฆฌํด๋ณธ๋ค.
๐ฉ ์๊ณ ๋ฆฌ์ฆ2: 5๋ก ๋๋์ด ๋จ์ด์ง๋? 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋?
ํ์ด ๊ณผ์ ์ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค!
- N์ด 5๋ก ๋๋์ด ๋จ์ด์ง๋ค๋ฉด N//5๋ก ๋ด์ง์๋ฅผ ๊ตฌํ ํ ์ถ๋ ฅํ๋ค.
- N์ด 5๋ก ๋๋์ด ๋จ์ด์ง์ง ์๋๋ค๋ฉด ๋ค์์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- N-3์ ํ์ฌ 3ํฌ๋ก๊ทธ๋จ ๋ด์ง๋ฅผ ํ๋ ์ฌ์ฉํ๋ค.
- N์ด 0๋ณด๋ค ์์ ๊ฒฝ์ฐ, ์ ํํ๊ฒ Nํฌ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์๋ ๊ฒ์ด๋ฏ๋ก -1์ ์ถ๋ ฅํ๋ค.
N = int(input())
cnt = 0
while 1:
if N % 5 != 0:
cnt += 1
N -= 3
elif N % 5 == 0:
print(cnt + N//5)
break
if N < 0:
print(-1)
break
๐ฉโ๐ป Algoritm: dp
ํด๋น ๋ฌธ์ ๋ฅผ dp๋ฅผ ์ ์ฉํด ํ์ดํ ์๋ ์๋ค.
๋๋ dp๋ฅผ ์ ์ฉํด๋ณผ ์๊ฐ์ ์์ ์ํด๋ดค๋คโฆใ ใ ใ ์ ๋ฆฌ๋ฅผ ํตํด์ ๊ทธ ๊ณผ์ ์ ๋ค์ ํ ๋ฒ ์ตํ์!!!
๊ทธ๋ ๋ค๋ฉด ์ด ๋ฌธ์ ์ dp๊ฐ ์ด๋ป๊ฒ ์ ์ฉ๋๋ ๊ฒ์ผ๊น???๐
- ๊ฐ๊ฐ Nํฌ๋ก๊ทธ๋จ์ผ๋ ๊ฐ์ ๊ณผ์ฐ ์ด๋ป๊ฒ ์ป์ด์ง๋ ๊ฒ์ผ๊น?
- [N-5] ํฌ๋ก๊ทธ๋จ์ผ ๋ ์ต์ ๋ด์ง์๋ค 5ํฌ๋ก๊ทธ๋จ ๋ด์ง ํ๋!
- [N-3] ํฌ๋ก๊ทธ๋จ์ผ ๋ ์ต์ ๋ด์ง์๋ค 3ํฌ๋ก๊ทธ๋จ ๋ด์ง ํ๋!
- ์ ๋ ๊ฐ ์ค ์ต์ ๊ฐ + 1 => ์ ํ์:
min(dp[n-3], dp[n-5])
๊ทธ๋ ๋ค! Nํฌ๋ก๊ทธ๋จ์ผ ๋ ์ต์ ๋ด์ง๋ ์ค์ง [N-5], [N-3]ํฌ๋ก๊ทธ๋จ์ผ ๋์ ๋ด์ง ์์ ์ํด์ ๊ฒฐ์ ๋๋ค! ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ dp๋ฅผ ์ ์ฉํ ์ ์๋ ๊ฒ์ด๋ค!
๐ฉ ์๊ณ ๋ฆฌ์ฆ1: dp ์ ์ฉ!
N = int(input())
dp = [-1 for _ in range(N+1)]
if N >= 3:
dp[3] = 1
if N >= 5:
dp[5] = 1
for i in range(6, N+1):
if dp[i-5] == -1 and dp[i-3] == -1:
continue
elif dp[i-5] == -1:
dp[i] = dp[i-3] +1
elif dp[i-3] == -1:
dp[i] = dp[i-5] +1
else:
dp[i] = min(dp[i-5], dp[i-3]) +1
print(dp[N])
- ์ด๊ธฐ๊ฐ์
-1
๋ก ์ง์ ํ๋ค. - dp[n-5], dp[n-3]์ด ๋ชจ๋ -1์ผ ๊ฒฝ์ฐ, ์ ํํ๊ฒ nํฌ๋ก๊ทธ๋จ์ ๋ง์ถ ์ ์๋ค๋ ๋ป์ด๋ฏ๋ก ์ด๊ธฐ๊ฐ -1์ด ์ ์ง๋๋ค.
- dp[n-5], dp[n-3] ์ค ํ๋๋ผ๋ -1์ด ์๋๋ผ๋ฉด ์๋ ํฌ๋ก๊ทธ๋จ์ ๋ด์ง ํ๋๋ฅผ ์ถ๊ฐํ์ฌ nํฌ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์๋ค.
- dp[n-5], dp[n-3] ๋ชจ๋ -1์ด ์๋๋ผ๋ฉด ๋ ์ค ์ต์๊ฐ์ ์ ํํด ๋ด์ง ํ๋๋ฅผ ์ถ๊ฐํ์ฌ nํฌ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ๊ทธ์น ๊ฒ์ด ์๋๋ผ ์ฐ๋ฆฌ๋ ํ๋ ๋ ์๊ฐํด๋ณผ ์ ์๋ค!
์ฌ๊ธฐ์ ๊ณต๊ฐ๋ณต์ก๋๋ O(n)์ด๋ค. ๊ทธ๋ ์ง๋ง n์ผ ๋ ํ์ํ ๋ถ๋ถ์ n-5
๊น์ง๋ง ํ์ํ๊ณ ๊ทธ ์ด์ ๊ฐ๋ค์ ํ์ํ์ง ์๋๋ค!!
โญ์ฆ! 0-5
๊น์ง๋ง ์์ผ๋ฉด ๋๋ค๋ ๋ป์ด๋ค!!โญ
๐ฉ ์๊ณ ๋ฆฌ์ฆ2: ๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ค์ด๊ธฐ
N = int(input())
dp = [-1 for _ in range(6)]
if N >= 3:
dp[3] = 1
if N >= 5:
dp[5] = 1
for i in range(6, N+1):
if dp[(i-5)%6] == -1 and dp[(i-3)%6] == -1:
continue
elif dp[(i-5)%6] == -1:
dp[i%6] = dp[(i-3)%6] +1
elif dp[(i-3)%6] == -1:
dp[i%6] = dp[(i-5)%6] +1
else:
dp[i%6] = min(dp[(i-5)%6], dp[(i-3)%6]) +1
print(dp[N%6])
๋๊ธ๋จ๊ธฐ๊ธฐ