[python]๋ฐฑ์ค€ 1463๋ฒˆ : 1๋กœ ๋งŒ๋“ค๊ธฐ

https://www.acmicpc.net/problem/1463

๋‚˜์˜ ๋‹ต

์—ฐ์‚ฐ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋งค๊ฒผ์Œ

1๋นผ๊ธฐ < 2๋‚˜๋ˆ„๊ธฐ < 1๋นผ๊ณ  3๋‚˜๋ˆ„๊ธฐ < 3๋‚˜๋ˆ„๊ธฐ

์—ฌ๊ธฐ์„œ 3๋‚˜๋ˆ„๊ธฐ > 1๋นผ๊ณ  2๋‚˜๋ˆ„๊ธฐ ์ด๋Ÿฌํ•œ ๊ฐ€์ •์„ ์˜ˆ์ œ ๊ณ„์‚ฐ๋งŒ์œผ๋กœ ํ™•์ •ํ•œ๋Œ€์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€ ์•Š๋‚˜ ์‹ถ๋‹ค.

์—ฐ์‚ฐ์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Œ

 

๋‹ค๋ฅธ ๋‹ต

(2020-04-19 ์ˆ˜์ •)

๋™์  ๊ณ„ํš๋ฒ•(Dynamic programming)์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๋™์  ๊ณ„ํš๋ฒ•์€ ์–ด๋–ค ๋ฌธ์ œ์˜ ๋‹ต์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ๊ฐ’์„ ๊ตฌํ•ด์•ผํ•  ๋•Œ ์ค‘๋ณต๊ณ„์‚ฐ์ด ํ•„์š”์—†๊ฒŒ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

x = int(input())
count = 0
minimum = [x]

def cal(x): # ์ฃผ์–ด์ง„ ํ–‰๋ ฌ์˜ ๋ชจ๋“  ์ˆ˜ ๊ฐ๊ฐ์— ๋Œ€ํ•ด์„œ -1, 3์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ, 2๋กœ ๋‚˜๋ˆ„๊ธฐ์˜ 3๊ฐ€์ง€ ์—ฐ์‚ฐ์„ ๋ชจ๋‘ ์ง„ํ–‰
    list = []
    for i in x:
        list.append(i-1) # 1์€ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ๋บ„ ์ˆ˜ ์žˆ์Œ
        if i%3 ==0: # 3์œผ๋กœ ๋‚˜๋ˆ ์ง€๋Š” ์ƒํ™ฉ
            list.append(i/3)
        if i%2 ==0: # 2๋กœ ๋‚˜๋ˆ ์ง€๋Š” ์ƒํ™ฉ
            list.append(i/2)
    return list

while True:
    if x == 1: # ์ฒ˜์Œ ์ž…๋ ฅ๋ฐ›์€ ์ˆ˜๊ฐ€ 1์ด๋ฉด
        print(count)
        break
    temp = minimum[:] # minimum ํ–‰๋ ฌ์˜ ์ˆ˜๋“ค์„ ์˜ฎ๊ฒจ๋ฐ›์Œ
    minimum = []
    minimum = cal(temp) # ๋‹ค์Œ ํ–‰๋ ฌ์„ ๋ฐ›์Œ
    count +=1
    if min(minimum) == 1:
        print(count)
        break

ํ’€์—ˆ์„ ๋• ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ณ  ํ˜„์žฌ ์ด ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ์•ˆ๋˜์–ด์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด 3^(10^6)๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ์ตœ๋Œ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ์•ˆ ๋‚˜์™”์„๊นŒ? (์˜๋ฌธ..) ๋˜ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ์ปค๋…• ํ•œ๋ฒˆ์˜ cal ํ•จ์ˆ˜ ์ƒ์—์„œ ๋™์ผํ•œ ์ˆ˜๊ฐ€ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜ค๋ฉด ์ง€์šฐ๋„๋ก set์œผ๋กœ ๊ตฌํ˜„๋„ ์•ˆํ•ด๋‘์—ˆ๋‹ค.

 

๊ณ ์นœ ์ฝ”๋“œ

<ํ•จ์ˆ˜ ๋‚ด์˜ set๋งŒ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ>

x = int(input())
count = 0
minimum = [x]

def cal(x): # ์ฃผ์–ด์ง„ ํ–‰๋ ฌ์˜ ๋ชจ๋“  ์ˆ˜ ๊ฐ๊ฐ์— ๋Œ€ํ•ด์„œ -1, 3์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ, 2๋กœ ๋‚˜๋ˆ„๊ธฐ์˜ 3๊ฐ€์ง€ ์—ฐ์‚ฐ์„ ๋ชจ๋‘ ์ง„ํ–‰
    a = set()
    for i in x:
        a.add(i-1) # 1์€ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ๋บ„ ์ˆ˜ ์žˆ์Œ
        if i%3 ==0: # 3์œผ๋กœ ๋‚˜๋ˆ ์ง€๋Š” ์ƒํ™ฉ
            a.add(int(i/3))
        if i%2 ==0: # 2๋กœ ๋‚˜๋ˆ ์ง€๋Š” ์ƒํ™ฉ
            a.add(int(i/2))
    return list(a)

while True:
    if x == 1: # ์ฒ˜์Œ ์ž…๋ ฅ๋ฐ›์€ ์ˆ˜๊ฐ€ 1์ด๋ฉด
        print(count)
        break
    temp = minimum[:] # minimum ํ–‰๋ ฌ์˜ ์ˆ˜๋“ค์„ ์˜ฎ๊ฒจ๋ฐ›์Œ
    minimum = []
    minimum = cal(temp) # ๋‹ค์Œ ํ–‰๋ ฌ์„ ๋ฐ›์Œ
    print(minimum)
    count +=1
    if min(minimum) == 1:
        print(count)
        break

 

 ํ•ด๋‹น ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ list๋ฅผ ์“ฐ๋˜ ์ฝ”๋“œ๋ฅผ set์„ ์“ฐ๋„๋ก ๋ฐ”๊ฟ”์„œ ๋™์ผํ•œ ์ˆ˜๊ฐ€ ๋‚˜์˜ฌ ๊ฒฝ์šฐ ์—†์• ๊ฒŒ ํ•˜์˜€๋‹ค.

๊ทธ๋žฌ๋”๋‹ˆ ์›๋ž˜๋Š” ์œ„์™€ ๊ฐ™์ด ์ค‘๋ณต๋œ ์ˆ˜๊ฐ€ ๊ณ„์† ๋‚˜์˜ค๋˜ list๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ค‘๋ณต๋œ ์ˆ˜๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ๋‹ค. ๋ฌผ๋ก  set์˜ ํŠน์„ฑ์ƒ ์ •๋ ฌ๋˜๊ธด ํ•˜์ง€๋งŒ ์–ด์ฐจํ”ผ ๋ชจ๋“  ์ˆ˜์— ๋Œ€ํ•ด์„œ ๊ตฌํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ด€์—†๋‹ค.

 

 

 ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋„ ์‹œ๋„ํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, python set ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํŠน์„ฑ์ƒ add ์—ฐ์‚ฐ์‹œ์—๋„ ํ˜„์žฌ set ๋‚ด๋ถ€์— ํ•ด๋‹น ์š”์†Œ๊ฐ€ ์žˆ๋Š”๋ฐ ๋ฎ์–ด์”Œ์šฐ๋Š” ๊ฑด์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†๊ณ  find ์—ฐ์‚ฐ ์ฒ˜๋Ÿผ ๋‚ด๋ถ€์— ํ•ด๋‹น ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ๋Š” ์—ฐ์‚ฐ์€ set ์ž๋ฃŒ๊ตฌ์กฐ ํŠน์„ฑ์ƒ ๋‹น์—ฐํžˆ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋ชจ๋“  ์š”์†Œ๋ฅผ for๋ฌธ์œผ๋กœ ๋Œ๋ฆฌ๋ฉด์„œ ๋น„๊ตํ•ด๋ด์•ผํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ์•ˆํ–ˆ๋‹ค. (๋จธ์“ฑ)

https://doorbw.tistory.com/57 ์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•