๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด/-

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์ ํ”„์™€ ์ˆœ๊ฐ„ ์ด๋™

by syLim___ 2023. 7. 7.
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/12980

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr


๋ฌธ์ œ๋ฅผ ๋ณด์ž๋งˆ์ž ๋„ˆ๋ฌด dp๋ฌธ์ œ๊ฐ™์•„์„œ dp ๋กœ ํ’€์—ˆ๋Š”๋ฐ,

์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ๋Š” ๋ชจ๋‘ ์„ฑ๊ณตํ–ˆ์ง€๋งŒ, ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ์—์„œ ์ „๋ถ€ ๋‹ค ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋–ด๋‹ค.

 

์ฒ˜์Œ ์ œ์ถœํ•œ ์ฝ”๋“œ๋Š” ์ด๋ ‡๋‹ค.

 python

def solution(n):
    INF = int(1e9)
    dp = [INF for _ in range(n+1)]
    
    dp[0] = 0
    dp[1] = 1
    
    for i in range(1,n+1):
        dp[i] = min(dp[i], dp[i-1]+1)
        if i*2 < n+1: # ์ˆœ๊ฐ„์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ˆœ๊ฐ„์ด๋™
            if i*2 == n:
                return dp[i]
            dp[i*2] = dp[i]
            
    return dp[n]

์œ„ ์ฝ”๋“œ๋Š” ๋น…์˜ค์‹œ๊ฐ„์ด O(n)์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋” ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ƒˆ๋กœ ์งœ์•ผ๊ฒ ๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.

์ฆ‰ ๋ชจ๋“  i๊ฐ’์„ ํ•˜๋‚˜ํ•˜๋‚˜ ํ™•์ธํ•ด๊ฐ€๋ฉฐ ๊ฑด์ „์ง€ ์†Œ๋ชจ๋Ÿ‰์„ ๊ณ„์‚ฐํ•˜๋Š” ํ’€์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

 

๋‹ค๋ฅธ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ O(logn) ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ์ฝ”๋“œ๋ฅผ ์ƒˆ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค

def solution(n):
    ans = 0
    while n:
        if n%2 == 0:
            n /= 2
        else:
            n -= 1
            ans += 1
    return ans

 

 

728x90