๋ชฉ์ฐจ
๐ซก 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) ๊ฐ์ ๋, ๋ ๋์ ๋ ๋ฒจ๋ก ์ ๋ฐ์ดํธ ๊ฐ๋ฅํ๋ค.
-> ๋ ๋ฒจ์ ์ ๋ฐ์ดํธํ๊ณ , ๋ ํฐ ๋ ๋ฒจ ๋ฒ์์์ ํ์์ ์์ํ๋ค.
๋ฐฐ์ด ์ /๋๋ ์
์ด๋ถ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด์ ๋ ์ ์๊ฒ ๋์์ต๋๋ค.