์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[Python][BoJ] 29717 ์Šฌ๋ผ์ž„ ์žก๊ณ  ๋ ˆ๋ฒจ ์—…!

jihuSunbae 2024. 12. 5. 11:03

 

 

๋ชฉ์ฐจ

     

     

    ๐Ÿซก Overview

    ์ฒด๊ฐ ๋‚œ์ด๋„: โ˜…โ˜…โ˜†โ˜†โ˜†

    ์†Œ์š”์‹œ๊ฐ„: 

    ๋ฌธ์ œ ๋ ˆ๋ฒจ: ์‹ค๋ฒ„2 / ๋ฌธ์ œ ์œ ํ˜•: ์ˆ˜ํ•™, ์ด๋ถ„ํƒ์ƒ‰
    ํ’€์ด ์ƒํƒœ:  ๋‹ต์•ˆ์ฐธ๊ณ 
    ์ถ”ํ›„: ๋‹ค์‹œ ํ’€์–ด๋ณด๊ธฐ

     

     


    ๋ฌธ์ œ ๋งํฌ

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

    ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„

    ๋”๋ณด๊ธฐ
    ๋”๋ณด๊ธฐ
    ๋ชฉํ‘œ: ์Šฌ๋ผ์ž„ N๋งˆ๋ฆฌ๋ฅผ ์ฒ˜์น˜ํ•  ๊ฒฝ์šฐ ๋ช‡ ๋ ˆ๋ฒจ๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ„์‚ฐํ•˜๊ธฐ
    
    - ๊ฒฝํ—˜์น˜ ํš๋“: ์ง€๊ธˆ๊นŒ์ง€ ์ฒ˜์น˜ํ•œ ๋ชฌ์Šคํ„ฐ ์ˆ˜(x) +1
    - ๊ฐ ๋ ˆ๋ฒจ์—…์— ํ•„์š”ํ•œ ๊ฒฝํ—˜์น˜ y =  2*(level)
      - ๋ ˆ๋ฒจ์—… ์‹œ ๊ฒฝํ—˜์น˜ ์†Œ์ง„ y๋งŒํผ ์†Œ์ง„
    - ์ดˆ๊ธฐ ์œ ์ € ์„ธํŒ…: ๋ ˆ๋ฒจ 1, ๊ฒฝํ—˜์น˜ 0
    ------------------------------

     

    ๋‚˜์˜ ์ฝ”๋“œ

    • ํ˜„์žฌ ๋ชฌ์Šคํ„ฐ๋ฅผ k ๋งˆ๋ฆฌ ์ฒ˜๋ฆฌํ–ˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ๋ˆ„์  ๊ฒฝํ—˜์น˜ : f(k) = k(k+1)/2 
      • ๋“ฑ์ฐจ์ˆ˜์—ด 1,2,3,..,K์˜ ๋ˆ„์ ํ•ฉ : k(k+1)/2
    • ๋ ˆ๋ฒจ l ๋กœ ์„ฑ์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒฝํ—˜์น˜์˜ ํ•ฉ: l(l+1), (l = 1,..) 
      • ๋“ฑ์ฐจ ์ˆ˜์—ด 2,4,6,8,10,.. ์˜ ๋ˆ„์ ํ•ฉ -> l(l+1)
    • ๋ฌธ์ œ: ๋ช‡ ๋ ˆ๋ฒจ๊นŒ์ง€ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? 
      • ๋‚˜์˜ ๋ˆ„์  ๊ฒฝํ—˜์น˜ k(k+1)/2 ๊ฐ€ ์„ฑ์žฅ ๋ˆ„์  ๊ฒฝํ—˜์น˜  l(l+1) ๋ณด๋‹ค ์ปค์ง€๋Š” ์ตœ๋Œ€์˜ l์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. 
    • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ
      • N์ด ๋„ˆ๋ฌด ํฌ๋‹ˆ๊นŒ (10**9) O(logN)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋Š” ์ด๋ถ„ ํƒ์ƒ‰์„ ์„ ํƒํ–ˆ๋‹ค.

     

    ๋”๋ณด๊ธฐ
    ๋”๋ณด๊ธฐ
    def find_level(N:int) -> int:
        """
        ๋ชฌ์Šคํ„ฐ ํ‚ฌ์ˆ˜๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๋ช‡ ๋ ˆ๋ฒจ ์ƒ์Šนํ–ˆ๋Š”์ง€ ์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
        - ๊ฒฝํ—˜์น˜์˜ ํ•ฉ:  n(n+1)
        :param N:
        :return:
        level: ์ƒ์Šน ๋ ˆ๋ฒจ ์ˆ˜
        """
        cur_exp = N * (N + 1) // 2 # ํ˜„์žฌ ๋‚˜์˜ ๊ฒฝํ—˜์น˜ ๋ˆ„์ ๊ฐ’, N์€ ์ฃฝ์ธ ๋ชฌ์Šคํ„ฐ์˜ ์ˆ˜ 
        l, r = 1, 10**9
        level = 0
        while l <= r:
            m = (l + r) // 2
            need = m*(m + 1)
            if cur_exp >= need: # ๊ฒฝํ—˜์น˜๊ฐ€ ์ถฉ๋ถ„ํ•˜๋ฉด ๋” ๋†’์€ ๋ ˆ๋ฒจ๋กœ ์—…๋Žƒ ๊ฐ€๋Šฅ
                level = m
                l = m + 1
            else:
                r = m - 1
        return level
    
    T = int(input()) # ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ˆ˜ 1<=T<=1000
    for _ in range(T):
        N = int(input()) # 1 <= N <= 10**9
        level_d = find_level(N)
        print(level_d+1)

     

    Obstacles 

    ์ด๋ถ„ ํƒ์ƒ‰ ์‹œ, ์ •๋‹ต๊ฐ’ ์—…๋ฐ์ดํŠธ ์กฐ๊ฑด์„ ์ œ๋Œ€๋กœ ์„ค์ •ํ•ด์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. 

    - ์ •๋‹ต๊ฐ’์„ ์–ธ์ œ ์—…๋ฐ์ดํŠธ ํ•ด์ค„ ๊ฒƒ์ธ๊ฐ€? 

       : ๋ฌธ์ œ์—์„œ ๋‚˜์˜ ๋ˆ„์  ๊ฒฝํ—˜์น˜๊ฐ€ ๋ ˆ๋ฒจ์—… ํ•„์š” ๊ฒฝํ—˜์น˜ ๋ณด๋‹ค (1) ํฌ๊ฑฐ๋‚˜ (2) ๊ฐ™์„ ๋•Œ, ๋” ๋†’์€ ๋ ˆ๋ฒจ๋กœ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•œ๋‹ค. 

       -> ๋ ˆ๋ฒจ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ๋” ํฐ ๋ ˆ๋ฒจ ๋ฒ”์œ„์—์„œ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค. 


    ๋ฐฐ์šด ์ /๋А๋‚€ ์ 

    ์ด๋ถ„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด์„œ ๋” ์ž˜ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.