ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

 

1463๋ฒˆ: 1๋กœ ๋งŒ๋“ค๊ธฐ

์ฒซ์งธ ์ค„์— 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 106๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

 

๋ฌธ์ œ ํ’€์ด

 ๋ฌธ์ œ๋Š” ํŠน์ • ์ˆ˜๊ฐ€ 1์ด ๋˜๊ธฐ ์œ„ํ•ด์„œ 2, 3์œผ๋กœ ๋‚˜๋ˆ„๊ฑฐ๋‚˜ -1์„ ํ•˜์˜€์„ ๋•Œ ์ตœ์†Œ ํšŸ์ˆ˜๋กœ 1์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค. ํšจ์œจ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜(memoization)์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ์ ‘๊ทผํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

 

Figure 1. 10์ผ ๊ฒฝ์šฐ์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜

 ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์€ ๊ทธ๋ฆผ 1๊ณผ ๊ฐ™๋‹ค. ๊ทธ๋ฆผ 1์€ 10์ธ ๊ฒฝ์šฐ์— ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ†ตํ•ด ๊ฐ’์„ ์ฐพ๋Š” ๊ณผ์ •์ด๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์นด์šดํŠธ ๊ฐ’์„ ๋ˆ„์ ์‹œ์ผœ๊ฐ€๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๊ฐ ์ธ๋ฑ์Šค๋Š” ์‹ค์ œ ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค. (1 ~ N)
  • ์ž…๋ ฅ๋œ ๊ฐ’๊ณผ ์ธ๋ฑ์Šค๋ฅผ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด 0๋ฒˆ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ž…๋ ฅ ๊ฐ’์ด 1์ธ ๊ฒฝ์šฐ, ํšŸ์ˆ˜๋Š” 1์ด๋ฏ€๋กœ ๋ณ„๋„์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ํ•„์š” ์—†๋‹ค.
  • ์ž…๋ ฅ ๊ฐ’์ด 1๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ํ†ตํ•ด ์ตœ์†Œ ์นด์šดํŠธ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š”๊ฐ€?
    • 3์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š”๊ฐ€?
    • ์œ„์˜ ๋‘ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ฐ”๋กœ ์•ž์˜ ์นด์šดํŠธ ํšŸ์ˆ˜์—์„œ 1์„ ์ถ”๊ฐ€ํ•œ๋‹ค

 ๊ทธ๋ฆผ 1์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด, 2์™€ 3์€ ๊ฐ๊ฐ ํ•œ๋ฒˆ์— ๊ณ„์‚ฐ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์นด์šดํŠธ ํšŸ์ˆ˜๋Š” 1์ด๋‹ค. ๊ทธ๋‹ค์Œ ๋ถ€ํ„ฐ๋Š” 4์˜ ๊ฒฝ์šฐ 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๊ณ  ๋ชซ์€ 2์ด๊ธฐ์— 2์˜ ์นด์šดํŠธ ํšŸ์ˆ˜ + 1์„ ํ•ด์ฃผ์–ด 2๋ผ๋Š” ๊ฐ’์„ ๊ธฐ๋กํ•œ๋‹ค. ์ด์™€ ๋‹ฌ๋ฆฌ 5์˜ ๊ฒฝ์šฐ 2, 3์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐ”๋กœ ์•ž์˜ 4์˜ ํ•ฉ์‚ฐ๋œ ์นด์šดํŠธ ์ˆ˜์— + 1์„ ํ•˜๊ฒŒ ๋˜๋ฉด 5๋ฅผ ๊ตฌํ•˜๋Š” ์ตœ์†Œ ํšŸ์ˆ˜๊ฐ€ ๋œ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ’์„ ๊ธฐ๋กํ•ด๋‘๊ณ , ๋ชซ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์˜ ์นด์šดํŠธ ํšŸ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜, 2์™€ 3์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ฐ”๋กœ ์•ž์˜ ์ˆ˜์— ๋Œ€ํ•œ ์นด์šดํŠธ๋ฅผ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

 

์ฝ”๋“œ

if __name__ == "__main__":
    n = int(input())

    memo = [0] * (n + 1)

    for i in range(2, (n + 1)):
        memo[i] = memo[i - 1] + 1
        if i % 2 == 0 and memo[i // 2] + 1 < memo[i]:
            memo[i] = memo[i // 2] + 1
        if i % 3 == 0 and memo[i // 3] + 1 < memo[i]:
            memo[i] = memo[i // 3] + 1

    print(memo[n])

 ์šฐ์„  ๋ฐ”๋กœ ์•ž์˜ ๊ฐ’์—์„œ + 1์„ ํ•œ ํ›„, 2์™€ 3์œผ๋กœ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ•ด๋‹น ์ˆซ์ž์˜ ์นด์šดํŠธ ํšŸ์ˆ˜๋Š” ์•ž์˜ ๊ฐ’ + 1์ด ๋œ๋‹ค. ์ฆ‰ 1์„ ๋นผ์•ผํ•˜๋Š” ์ƒํ™ฉ์€ ๊ทธ๋ฆผ 1์—์„œ ์ธ๋ฑ์Šค 5, 7, 10๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์ด๋‹ค.

728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€