๐ช [1๋ก ๋ง๋ค๊ธฐ]
1463๋ฒ: 1๋ก ๋ง๋ค๊ธฐ
์ฒซ์งธ ์ค์ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 106๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์ N์ด ์ฃผ์ด์ง๋ค.
www.acmicpc.net
๐ ๋ฌธ์ ์ค๋ช
์ ์ X์ ์ฌ์ฉํ ์ ์๋ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค
- X๊ฐ 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ฉด, 3์ผ๋ก ๋๋๋ค.
- X๊ฐ 2๋ก ๋๋์ด ๋จ์ด์ง๋ฉด, 2๋ก ๋๋๋ค.
- 1์ ๋บ๋ค.
์ ์ N์ด ์ฃผ์ด์ก์ ๋, ์์ ๊ฐ์ ์ฐ์ฐ ์ธ ๊ฐ๋ฅผ ์ ์ ํ ์ฌ์ฉํด 1์ ๋ง๋ค์. ์ฐ์ฐ์ ์ฌ์ฉํ๋ ํ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ผ.
๐๐จ ์ ์ถ๋ ฅ ๋ฐ์ดํฐ
[์ ๋ ฅ]
์ฒซ์งธ ์ค์ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 106๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์ N์ด ์ฃผ์ด์ง๋ค.
2
[์ถ๋ ฅ]
์ฒซ์งธ ์ค์ ์ฐ์ฐ์ ํ๋ ํ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
1
๐ ๋ฌธ์ ํ์ด
์ต์๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๊ณ , ๊ฐ์ฅ ํจ์จ์ ์ธ ์์๊ฐ %3,%2,-1์ ์์์ด๊ธฐ์ ์์นซํ๋ฉด '๊ทธ๋ฆฌ๋' ์ ํ์ ๋ฌธ์ ๋ผ ํ์ ํ ์ ์๋ค. ํ๋ ์ด๋ ์๋ชป๋ ํ์ด์ธ๋ฐ ์๋ํ๋ฉด N=10์ผ ๊ฒฝ์ฐ, ํด๋น ํ์ด๋ฅผ ํตํ ๋ต์ 5์ด๋ ์ ๋ต์ 4์ด๊ธฐ ๋๋ฌธ์ด๋ค.
# ์๋ชป๋ ํ์ด
n = int(input())
d = [0]*(n+1)
for i in range(2, n+1): # %3, %2, -1 ์์ด ์ต์ ์ ํด๋ก ๋ณด์ด๋ → ๋ชจ๋ ๊ฒฝ์ฐ์ ์ฑ๋ฆฝ X.
if i % 3 == 0: # ๋ชจ๋ ์ํฉ์ ๊ณ ๋ คํ์ฌ ๋น๊ตํจ ํ์, "DP ํ์ด"!!
d[i] = d[i//3] + 1
elif i % 2 == 0:
d[i] = d[i // 2] + 1
else:
d[i] = d[i-1] + 1
print(d)
print(d[n])
๋ฐ๋ผ์ ์์ฒ๋ผ ์ต์ ์ ๋ฐฉ๋ฒ์ผ๋ก ํด๋ฅผ ๊ตฌํ๊ณ ์ํ๋ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ต์ ๋์ถํด์๋ ์๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํ์ด์ผ ํ ๊น?
์ ๋ฌธ์ ์ ์ฃผ์ด์ง ์กฐ๊ฑด์ ์ ๋ฆฌํ๋ฉด, D[i] = min(D[i/3]+1, D[i/2]+1, D[i-1]+1)์ด๋ผ๋ ์์์ผ๋ก ํํ์ด ๊ฐ๋ฅํ๋ค.
์ฆ ์ ํ์์ ์ด์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ์ชผ๊ฐ์ด ํ ์ ์๊ธฐ์ ์ด๋ '๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ' ์ ํ์ ๋ฌธ์ ์ด๋ค.
๋ค์ด๋๋ฏน ๋ฌธ์ ๋ ์ ํ์์ ๊ตฌํ๋ค๋ฉด ๊ตฌํ๋ง ๋จ๋๋ฐ ์ด๋ ๊ตฌํ์ ๊ฒฝ์ฐ 'top-down' ๋ฐฉ์๊ณผ 'bottom-up' ๋ฐฉ์ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค. ๋จผ์ top-down ๋ฐฉ์์ ์ด์ฉํ์ฌ ์ฝ๋๋ฅผ ๊ตฌํํด๋ณด์. ๊ตฌํํ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
# Top-Down(์ฌ๊ท ์ด์ฉ) : ์ฌ๊ท๋ฅผ ์ด์ฉํ๊ฒ ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ ํ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋๋ฏ๋ก Bottom-Up์ผ๋ก ํธ๋ ๊ฒ์ด ์ข๋ค.
import sys
sys.setrecursionlimit(1000000) # ์ฌ๊ท ํธ์ถ ์ ํ ์ ๊ฑฐ (N<=10^6)
def go(n):
if n == 1:
return 0
if d[n] > 0:
return d[n]
d[n] = go(n - 1) + 1 # ๋ฐฐ์ด์ ๋ฏธ๋ฆฌ '์ต์
์ ๊ฒฝ์ฐ(=1์นธ์ฉ๋ง ์ ์ง)'๋ฅผ ์ ์ฅํด ๋ . ๊ทธ๋ฆฌ๊ณ ์๋์์ ๋น๊ต๋ฅผ ํตํด ๋ ๋์ ๊ฐ์ผ๋ก ๊ตํ
if n % 2 == 0:
temp = go(n // 2) + 1 # ๋๋๊ธฐ(/)๋ก ํ๋ฉด ์์ ๋์์ ์ค๋ฅ ์๊น (์ค์ X. ์ ์ O)
if d[n] > temp:
d[n] = temp
if n % 3 == 0:
temp = go(n // 3) + 1
if d[n] > temp:
d[n] = temp
return d[n]
n = int(input())
d = [0] * (n + 1) # DP ๐ "Memoization!"
print(go(n))
top-down ๋ฐฉ์์ '์ฌ๊ท'๋ฅผ ํตํด ๊ตฌํํ์๊ณ , ํ์ด์ฐธ ์๋ํฐ๋ฅผ ์ด์ฉํด ์ฃผ์ด์ง ์๋ค์ ๋๋ ค๋ณด์์ ๋ ๋ชจ๋ ์์ ๋ต์ ์ ํํ ์ถ๋ ฅํ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ํ๋ ๋ฐฑ์ค ์ฌ์ดํธ์ ์ ์ถ์ ์๋์ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.

๊น๋ญ์ ์ผ๋จ ์ฃผ์ด์ง ๋ฌธ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ด 128 MB๋ก ์๋ ์์๋ฐ๋ค๊ฐ, ์ฌ๊ท๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ ํ์ด์ฌ์์ ์๊ฐ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์์๊ฐ ๋๋ฌด ํฐ ํ์ด์๋ค. ์ฆ, top-down ๋ฐฉ์์ ํตํ ์ฝ๋๋ ์ ํฉํ์ง ์๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ๋ฒ์งธ ๋ฐฉ์์ธ bottom-up ๋ฐฉ์์ ์ฝ๋๋ฅผ ๊ตฌํํด๋ณด์๋๋ฐ ์ด ๋ฐฉ์์ผ๋ก๋ ํต๊ณผ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ํด๋น ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
n = int(input())
d = [0]*(n+1)
for i in range(2, n+1): # for๋ฌธ์ ํตํด ์์ฐจ์ ์ผ๋ก ๋ฐ๋ณต ์งํ!
d[i] = d[i-1] + 1 # ์์ฐจ์ ์ผ๋ก ์ฑ์ ๊ธฐ ๋๋ฌธ์ i-1๋ถํฐ 0๊น์ง ๊ฐ๋ค์ด ๋ชจ๋ d์ ์ ์ฅ ๆ
if i % 3 == 0:
d[i] = min(d[i//3] + 1, d[i]) # ๊ผญ ์ด๋ค ํน์ ์กฐ๊ฑด์ด ์ต์ ์ ์ต์๊ฐ์ด๋ผ๋ ๋ณด์ฅ X. ๋ฐ๋ผ์ min์ผ๋ก ๋น๊ตํด์ค.
if i % 2 == 0: # ๋ง์ฐฌ๊ฐ์ง๋ก ๊ผญ %3์ด %2๋ณด๋ค ์ต์ ์ด๋ผ๋ ๋ณด์ฅ X. ๋ฐ๋ผ์ elif๊ฐ ์๋ if ์ฒ๋ฆฌ.
d[i] = min(d[i//2] + 1, d[i])
print(d[n])
์ ํ์ด์ฌ์ ์ด์ฉํ์ฌ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ๋ฅผ ํ ๊ฒฝ์ฐ ์ ๋งํ๋ฉด 'bottom-up' ๋ฐฉ์์ผ๋ก ํธ๋ ๊ฒ์ด ๊ถ์ฅ๋๋์ง,, ๊ทธ ์ด์ ๋ฅผ ๋ผ์ ๋ฆฌ๊ฒ ๋๋ ์ ์์๋ค..๐ญ
๐ ํ์ด/๊ฐ๋ ์ ๋ฆฌ
- ์ฌ๊ทํจ์์ ์ฌ์ฉ
- ์ฌ๊ทํจ์์ ์ ํ ์ ๊ฑฐ
: sys.setrecursionlimit(1000000) - ํ์ด์ฌ & ๋ค์ด๋๋ฏน ๋ฌธ์ ๐ bottom-up์ผ๋ก ํ์ด๋ผ!
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [๋ฐฑ์ค] 6064. ์นด์ ๋ฌ๋ ฅ (0) | 2022.03.05 |
|---|---|
| [๋ฐฑ์ค] 14500. ํ ํธ๋ก๋ฏธ๋ ธ (์์ฑ ไธญ) (0) | 2022.03.02 |
| [๋ฐฑ์ค] 1107. ๋ฆฌ๋ชจ์ปจ (0) | 2022.03.01 |
| [๋ฐฑ์ค] 1476. ๋ ์ง ๊ณ์ฐ (0) | 2022.03.01 |
| [๋ฐฑ์ค] 3085. ์ฌํ ๊ฒ์ (0) | 2022.02.23 |