๊ด€๋ฆฌ ๋ฉ”๋‰ด

CS Student’s SAP&Tech Journey๐Ÿ’ซ

[ํŒŒ์ด์ฌ] 11561๋ฒˆ: ์ง•๊ฒ€๋‹ค๋ฆฌ / ์ด๋ถ„ํƒ์ƒ‰ ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€ | ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค | ์†Œํ”„ํ‹ฐ์–ด

[ํŒŒ์ด์ฌ] 11561๋ฒˆ: ์ง•๊ฒ€๋‹ค๋ฆฌ / ์ด๋ถ„ํƒ์ƒ‰

์ธํฌ๋งˆํ‹ฑ 2024. 10. 30. 00:38


 

1. ๋ฐฑ์ค€ 11561๋ฒˆ ์ง•๊ฒ€๋‹ค๋ฆฌ

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

 

N๋ฒˆ ์ง•๊ฒ€๋‹ค๋ฆฌ๋Š” ๋ฐ˜๋“œ์‹œ ๋ฐŸ์•„์•ผ ํ•œ๋‹ค. 

:: ๋งˆ์ง€๋ง‰ ์ง•๊ฒ€๋‹ค๋ฆฌ๋Š” ๋ฐŸ์•„์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

:: ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž…๋ ฅ์ด 100์ด๋ฉด 13๋ฒˆ์งธ ์ง•๊ฒ€๋‹ค๋ฆฌ๋Š” ๊ผญ ๊ฑด๋„ˆ์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. 100์„ ๋ฐŸ๋Š”๋‹ค๋Š” ๋œป ์•„๋‹˜!

 

2. ์˜ค๋Š˜์˜ ํšŒ๊ณ 

* ์ •๋‹ต์€ ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ: ๋‹จ์ˆœ ๊ตฌํ˜„์œผ๋กœ ํ’€๊ธฐ :: ์‹œ๊ฐ„์ดˆ๊ณผ

๋‹จ์ˆœ ๊ตฌํ˜„์„ ํ†ตํ•ด์„œ ํ’€์–ด๋ณด์•˜๋‹ค. ์ œ์‹œ๋ฌธ์„ ํ†ตํ•ด ์ง•๊ฒ€๋‹ค๋ฆฌ๊ฐ€ 1 2 3 4 5 6 7 8 9 10 ... ์ค‘ 1 3 6 10 ์— ํ•ด๋‹นํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํŒŒ์•…ํ•˜๊ณ  ๋‹จ์ˆœ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด N์—์„œ ๋นผ๋Š” ๊ฐ’์„ ๋Š˜๋ฆฌ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€๋‹ค.

 

N์˜ ๋ฒ”์œ„๋Š” (1 ≤ N ≤ 10**16) ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ดˆ๊ณผ ๋ฐœ์ƒํ•œ๋‹ค.

T = int(input())

for j in range(T):
    n = int(input())
    i = 2
    cnt = 1
    if n==1 or n==2:
        print(1)
    else:
        while True:
            n = n-i
            i = i+1
            cnt = cnt+1
            if n<0:
                cnt = cnt-1
                print(cnt)
                break
            elif n==0:
                print(cnt)
                break

 

๋‘ ๋ฒˆ์งธ ์ ‘๊ทผ: ์ด๋ถ„ํƒ์ƒ‰ ::์„ฑ๊ณต

1. ์ž…๋ ฅ ๋ฒ”์œ„ ํŒŒ์•…ํ•˜๊ธฐ

์ง•๊ฒ€๋‹ค๋ฆฌ์˜ ์ด ์ˆ˜ N์˜ ๋ฒ”์œ„๊ฐ€ (1 ≤ N ≤ 10**16)๋กœ ์ฃผ์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ถ„ํƒ์ƒ‰์ž„์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๋ฌธ์ œ์— ์ ‘๊ทผํ•  ๋•Œ ์–ด๋–ค ๊ฒƒ์„ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ์–ด์„œ ์ตœ๋Œ€ ์ตœ์†Œ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋Š” ์ด๋ถ„ํƒ์ƒ‰์„ ๊ณ ๋ คํ•ด๋ณด์•„์•ผ ํ•œ๋‹ค.

 

2. ํ’€์ด๊ณผ์ •

1) Left, Right ์ •ํ•˜๊ธฐ

์ง•๊ฒ€๋‹ค๋ฆฌ ์ ํ”„๋ฅผ 1๋ฒˆ ํ•˜๋ฉด ๊ฑฐ๋ฆฌ๋Š” 1, ์ ํ”„๋ฅผ ๋‘ ๋ฒˆ ํ•˜๋ฉด ๊ฑฐ๋ฆฌ๋Š” 1+2, ์ ํ”„๋ฅผ ์„ธ ๋ฒˆ ํ•˜๋ฉด ๊ฑฐ๋ฆฌ๋Š” 1+2+3์œผ๋กœ ๋“ฑ์ฐจ์ˆ˜์—ด๋Œ€๋กœ ๊ฑฐ๋ฆฌ๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค. ๋”ฐ๋ผ์„œ ์ ํ”„๋Š” K๋ฒˆํ•˜๋ฉด ๊ฑฐ๋ฆฌ๋Š” K*(K+1) // 2 ๋งŒํผ ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค. 

 

์ง•๊ฒ€๋‹ค๋ฆฌ๋ฅผ 100๊ฐœ ์ฃผ์–ด์ง„๋‹ค๊ณ  ์นœ๋‹ค.

 

์ ํ”„๋ฅผ 12๋ฒˆ ํ•˜๋ฉด ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฐœ์ˆ˜(๊ฑฐ๋ฆฌ)๋Š” 12*(12+1) // 2 = 78๊ฐœ๊ฐ€ ๋œ๋‹ค

   ====> ์ฃผ์–ด์ง„ 100๊ฐœ๋ณด๋‹ค ํ•œ์ฐธ์ž‘์Œ (์ตœ๋Œ€์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š์Œ)

์ ํ”„๋ฅผ 13๋ฒˆ ํ•˜๋ฉด ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฐœ์ˆ˜(๊ฑฐ๋ฆฌ)๋Š” 13*(13+1) // 2 = 91๊ฐœ๊ฐ€ ๋œ๋‹ค. 

   ====> ์ฃผ์–ด์ง„ 100๊ฐœ๋ณด๋‹ค 9๊ฐœ ์ž‘์Œ (์ตœ๋Œ€์— ๋ถ€ํ•ฉํ•จ)

์ ํ”„๋ฅผ 14๋ฒˆ ํ•˜๋ฉด ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฐœ์ˆ˜(๊ฑฐ๋ฆฌ)๋Š” 14*(14+1) // 2 = 105๊ฐœ๊ฐ€ ๋œ๋‹ค.

   ====> ์ฃผ์–ด์ง„ 100๊ฐœ๋ณด๋‹ค ๋งŽ์Œ (์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฐœ์ˆ˜๋ณด๋‹ค ๋งŽ์•„ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์Œ )

 

๋”ฐ๋ผ์„œ ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฐœ์ˆ˜๋Š” 13๊ฐœ์ด๋‹ค.

์ ํ”„ ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ง•๊ฒ€๋‹ค๋ฆฌ(๊ฑฐ๋ฆฌ)๊ฐ€ ๋งŽ์•„์ง„๋‹ค. ๋‹จ, ์ฃผ์–ด์ง„ N๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

 

Left์™€ Right๋Š” ์ ํ”„ ํšŸ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  Mid๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

Left = 0 Right = 10**16

Mid = (Left + Right) // 2

๊ฑฐ๋ฆฌ = (Mid * (Mid +1)) // 2

 

 

2) ์ด๋ถ„ํƒ์ƒ‰

 

๋งŒ์•ฝ ๊ฑฐ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง„ N๋ณด๋‹ค ์ž‘์œผ๋ฉด ์ผ๋‹จ ๊ฐ’ ์ €์žฅ cnt = mid ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ๋Œ“๊ฐ’์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Left = mid + 1 

๋งŒ์•ฝ ๊ฑฐ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง„ N๋ณด๋‹ค ํฌ๋ฉด ๊ฑฐ๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Right = mid - 1

 

 

T = int(input())

for j in range(T):
    n = int(input())
    cnt = 0
    left = 1
    right = 10 ** 16
    while left <= right:
        mid = (left +right)//2
        ds = (mid*(mid+1))//2
        if ds < n:
            cnt = mid
            left = mid +1
        elif ds > n:
            right = mid -1
        else:
            cnt = mid
            break

    print(cnt)