๋ฌธ์
https://www.acmicpc.net/problem/1463
๋ฐฑ์ค ๋จ๊ณ๋ณ๋ก ํ์ด๋ณด๊ธฐ - ๋์ ๊ณํ๋ฒ1
ํ์ด
์ ์ X์ ์ฌ์ฉํ ์ ์๋ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ด ์ธ ๊ฐ์ง ์ด๋ค.
1. X๊ฐ 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ฉด, 3์ผ๋ก ๋๋๋ค.
2. X๊ฐ 2๋ก ๋๋์ด ๋จ์ด์ง๋ฉด, 2๋ก ๋๋๋ค.
3. 1์ ๋บ๋ค.
์ ์ N์ด ์ฃผ์ด์ก์ ๋, ์์ ๊ฐ์ ์ฐ์ฐ ์ธ ๊ฐ๋ฅผ ์ ์ ํ ์ฌ์ฉํด์ 1์ ๋ง๋ค๋ ค๊ณ ํ๋ค. ์ฐ์ฐ์ ์ฌ์ฉํ๋ ํ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ์์ค.
์ฃผ์ด์ง ๊ฐ N์ด 1์ด ๋ ๋๊น์ง ์ธ๊ฐ์ง ์กฐ๊ฑด์ ์ฒดํฌํด๊ฐ๋ฉฐ ์ต์ ์ ์ผ์ด์ค๋ฅผ ๊ตฌํด์ผํ๋ค.
์ฒซ๋ฒ์งธ ํ์ด
N = int(input())
def make_one():
dp = [0] * (N+1)
for i in range(2, N+1):
dp[i] = dp[i-1] + 1
if i % 2 == 0:
dp[i] = min(dp[i], dp[i//2] + 1)
if i % 3 == 0:
dp[i] = min(dp[i], dp[i//3] + 1)
return dp[-1]
print(make_one())
์ฐ์ dp๋ฅผ N+1๋งํผ ์์ฑํด์ค๋ค. dp์ ์ธ๋ฑ์ค = ํด๋น์ซ์ ๋ก ์ฌ์ฉํ ์์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
dp์ ๊ฐ ๊ฐ์๋ 'ํด๋น ์๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ต์ํ์ ์ฐ์ฐํ์' ๊ฐ ๋ค์ด๊ฐ ์์ ์ด๋ค.
1์ ๋ฐ๋ก ๋ฐํํ๋ฉด ๋๋ฏ๋ก, 2๋ถํฐ N๊น์ง ๋ฐ๋ณตํ๋ค.
๋จผ์ dp[i]์ ๊ฐ์์ 1์ ๋นผ๋ ๊ฒฝ์ฐ๋ฅผ ์ฒดํฌํ๋ค.
์ฆ dp[i]์ ๊ฐ = dp[i์์ 1์ ๋บ ๊ฐ]์ ์ฐ์ฐํ์ + 1์ ๋บ์ผ๋ฏ๋ก ์ฐ์ฐํ์ 1 ์ฆ๊ฐ ์ธ ์
์ด๋ค.
๊ทธ๋ฆฌ๊ณ i๊ฐ 2๋ก ๋๋์ด๋จ์ด์ง๋ค๋ฉด, '1์ ๋บ์๋์ ์ฐ์ฐํ์'๊ณผ '2๋ก ๋๋์์๋์ ์ฐ์ฐํ์'๋ฅผ ๋น๊ตํ๋ค.
๋ ์์๊ฐ์ dp[i]์ ์ ์ฅํ๋ค.
๋ 3์ผ๋ก๋ ๋๋์ด๋จ์ด์ง๋ค๋ฉด '3์ผ๋ก ๋๋์์๋์ ์ฐ์ฐํ์'์ '1์ ๋บ์๋์ ์ฐ์ฐํ์ or 2๋ก ๋๋์์๋์ ์ฐ์ฐํ์'๋ฅผ ๋น๊ตํ๋ค.
์ญ์ ๋ ์์๊ฐ์ dp[i]์ ์ ์ฅํ๋ค.
์ ๊ณผ์ ์ N๊น์ง ๋ฐ๋ณตํ๋ฉด N์ ๋ง๋ค๊ธฐ์ํ ์ต์ํ์ ์ฐ์ฐํ์๊ฐ ๊ตฌํด์ง๋ค.
๋ง์ง๋ง์ผ๋ก dp[N]์ ๊ฐ, dp[-1]์ ๋ฐํํ๋ค.
๋๋ฒ์งธ ํ์ด
์ง์ ํผ ๊ฒ์ ์๋๊ณ ... ์คํ์๊ฐ์ด 32ms๊ธธ๋ ์ ์ด๋จ๋ ์ฝ๋๋ค.
๋์
๋๋ฆฌ๋ฅผ ์ด์ฉํด ๋ฉ๋ชจ์ด์ ์ด์
์ ๊ตฌํํ๋ค.
N = int(input())
cache = {1: 0}
def make_one(number):
if 1 < number < 4:
return 1
if number in cache.keys():
return cache[number]
a_third = make_one(number // 3) + 1 + number % 3
a_second = make_one(number // 2) + 1 + number % 2
cache[number] = min(a_third, a_second)
return cache[number]
print(make_one(N))
1์ ๋ ์ฐ์ฐํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋์
๋๋ฆฌ cache์ 1: 0์ ์ ์ฅํด๋๊ณ ์์ํ๋ค.
๋ง์ฝ ์ฃผ์ด์ง number๊ฐ 2, 3์ด๋ผ๋ฉด ๋ฐ๋ก 1์ ๋ฐํํด์ค๋ค.
(2-1 = 1, 2//2 = 1, 3//3 = 1)
๋๋ ์ด๋ฏธ cache์ ํค๊ฐ์ผ๋ก ์กด์ฌํ๋ ์ํฉ์ผ๋ ๋ฐ๋ก ๋ฐํํด์ค๋ค.
์์ ๋ ์กฐ๊ฑด์ ํด๋นํ์ง ์๋๋ค๋ฉด ์ฌ๊ท๋ฅผ ์์ํ๋ค.number์ 3์ผ๋ก ๋๋๊ฐ์ 1๋ก ๋ง๋๋ ์ฐ์ฐํ์ + 1(3์ผ๋ก ๋๋ ์ฐ์ฐ) + number์ 3์ผ๋ก ๋๋ด์๋์ ๋๋จธ์ง๊ฐ
์ ๊ตฌํด์ค๋ค.
๋ง์ฝ number๊ฐ 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ ์ํฉ์ด๋ผ๋ฉด number % 3์ 0์ด ๋ ๊ฒ์ด๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด 1์ ๋นผ์ฃผ๋ ์ฐ์ฐ ํ์๊ฐ ๋๋ ์
์ด๋ค.
์๋ฅผ๋ค์ด, 10์ด ์ฃผ์ด์ก๋ค๊ณ ํด๋ณด์.
10 // 3 = 3์ด๋ ์ธ์๊ฐ์ผ๋ก 3์ ๋ฃ์ด์ฃผ๋ฉด ์ฒซ๋ฒ์งธ ์กฐ๊ฑด์ ์ํด 1์ด ๋ฐํ๋๋ค.
์ฆ, make_one(10//3 = 3) + 1 + 10 % 3 => 1 + 1 + 1 => 3
์ค์ ๋ก ํ์ธํด๋ด๋ 10 -> 9 -> 3 -> 1 ๋ก 3์ด ๋์จ๋ค.
2๋ก ๋๋๋ ๊ฒฝ์ฐ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌํด์ค ๋ค, 3์ผ๋ก ๊ณ์ฐํ ๊ฐ๊ณผ 2๋ก ๊ณ์ฐํ ๊ฐ ์ค ๋ ์์๊ฐ์ ๋์ ๋๋ฆฌ์ ์ ์ฅํ๋ค.
๋ง์ง๋ง์ผ๋ก N์ ํด๋นํ๋ ํค๊ฐ์ ๋ฐํํ๋ค.