๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/BOJ

[๋ฐฑ์ค€] 1463. 1๋กœ ๋งŒ๋“ค๊ธฐ

 

๐Ÿ“ช [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' ๋ฐฉ์‹์œผ๋กœ ํ‘ธ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋Š”์ง€,, ๊ทธ ์ด์œ ๋ฅผ ๋ผˆ์ €๋ฆฌ๊ฒŒ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค..๐Ÿ˜ญ

 

 

 

 


 

 

๐Ÿ”” ํ’€์ด/๊ฐœ๋…์ •๋ฆฌ

  1. ์žฌ๊ท€ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ
  2. ์žฌ๊ท€ํ•จ์ˆ˜์˜ ์ œํ•œ ์ œ๊ฑฐ
    : sys.setrecursionlimit(1000000)  
  3. ํŒŒ์ด์ฌ & ๋‹ค์ด๋‚˜๋ฏน ๋ฌธ์ œ ๐Ÿ‘‰ bottom-up์œผ๋กœ ํ’€์–ด๋ผ!

 

728x90