01) ๋ฌธ์
๋ํ์ด์ ์ง N๊ฐ๊ฐ ์์ง์ ์์ ์๋ค. ๊ฐ๊ฐ์ ์ง์ ์ขํ๋ x1, ..., xN์ด๊ณ , ์ง ์ฌ๋ฌ๊ฐ๊ฐ ๊ฐ์ ์ขํ๋ฅผ ๊ฐ์ง๋ ์ผ์ ์๋ค.
๋ํ์ด๋ ์ธ์ ์ด๋์๋ ์์ดํ์ด๋ฅผ ์ฆ๊ธฐ๊ธฐ ์ํด์ ์ง์ ๊ณต์ ๊ธฐ C๊ฐ๋ฅผ ์ค์นํ๋ ค๊ณ ํ๋ค. ์ต๋ํ ๋ง์ ๊ณณ์์ ์์ดํ์ด๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์, ํ ์ง์๋ ๊ณต์ ๊ธฐ๋ฅผ ํ๋๋ง ์ค์นํ ์ ์๊ณ , ๊ฐ์ฅ ์ธ์ ํ ๋ ๊ณต์ ๊ธฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ ํฌ๊ฒ ํ์ฌ ์ค์นํ๋ ค๊ณ ํ๋ค.
C๊ฐ์ ๊ณต์ ๊ธฐ๋ฅผ N๊ฐ์ ์ง์ ์ ๋นํ ์ค์นํด์, ๊ฐ์ฅ ์ธ์ ํ ๋ ๊ณต์ ๊ธฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ต๋๋ก ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ /์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ง์ ๊ฐ์ N (2 โค N โค 200,000)๊ณผ ๊ณต์ ๊ธฐ์ ๊ฐ์ C (2 โค C โค N)์ด ํ๋ ์ด์์ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ง์ ์ขํ๋ฅผ ๋ํ๋ด๋ xi (0 โค xi โค 1,000,000,000)๊ฐ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค.
์ฒซ์งธ ์ค์ ๊ฐ์ฅ ์ธ์ ํ ๋ ๊ณต์ ๊ธฐ ์ฌ์ด์ ์ต๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค.
5 3
1
2
8
4
9
// output is 3
02) ํ์ด
- ๊ตฌํ๊ณ ์ ํ๋ ๊ฒ์ ๊ณต์ ๊ธฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ
D
์ด๋ค. - ๊ณต์ ๊ธฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ lower/upper bound๋ฅผ ์ ํ๋ค.
- lower๋
1
(์ง์ ๋ชจ๋ ๋ค๋ฅธ ์ขํ์ด๋ฏ๋ก) - upper๋
๋ง์ง๋ง ์ง์ ์ขํ - ์ฒซ๋ฒ์งธ ์ง์ ์ขํ
- lower๋
D
์ ์กฐ๊ฑด์ ์๊ฐํด ๋ณธ๋ค.- ๊ฐ๊ฒฉ์ผ๋ก C๊ฐ์ ๊ณต์ ๊ธฐ๋ฅผ ๋ชจ๋ ์ค์น ๊ฐ๋ฅํด์ผ ํ๋ค.
- ์กฐ๊ฑด์ ๋ง์กฑํ๋
D
์ ์ต๋๊ฐ์ ์ฐพ๋๋ค.
# ๊ฐ๊ฒฉ์ ๋ง์กฑํ๋ ์ง์ ๊ฐ์๋ฅผ ๋ฐํํฉ๋๋ค.
def installable(๊ฐ๊ฒฉ):
curr = H[0] # ์ง ๋ฐฐ์ด H์ ์ฒซ๋ฒ์งธ ์ง ๊ธฐ์ค์ผ๋ก
for i in H[1] to end:
if H[i] - curr >= ๊ฐ๊ฒฉ:
cnt += 1
curr = H[i]
return cnt
# ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ต๋๊ฐ์ ํ์ํฉ๋๋ค.
s, e = lower, upper
while s <= e:
mid = (s+e)//2
# mid๋ฅผ ๊ฐ๊ฒฉ์ผ๋ก ํ์ ๋ ์ค์น ๊ฐ๋ฅํ ๊ณต์ ๊ธฐ์ ์ cnt
cnt = installable(mid)
if cnt < C: # ๋ง์ฝ ๋ชจ๋ ๊ณต์ ๊ธฐ๋ฅผ ์ค์นํ ์ ์์ผ๋ฉด
e = mid-1 # ๋ ์ข์ ๊ฐ๊ฒฉ์ ๊ฒ์
else:
s = mid + 1 # ๊ฐ๊ฒฉ์ ๋ํ (์ต๋๋ฅผ ๊ตฌํ๊ธฐ ์ํด)
์ฌ๊ธฐ์ ์ค๊ฐ์ค๊ฐ ๊ฐ๊ฒฉ์ ์ต๋๊ฐ์ ์ ์ฅํด์ฃผ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค. ๊ณต์ ๊ธฐ์ ์ค์น ๊ฐ๋ฅ์ ์ฒดํฌํ๋ installable
๋ถ๋ถ์์ mid๋ณด๋ค ํฐ ๊ฐ๊ฒฉ์ ์ต์์น๋ฅผ ์ ์ฅํด๋๋๋ฐ, ์ด๋ ๊ฐ๊ฒฉ์ lower bound๋ฅผ ๊ฐฑ์ ํ์ฌ ๋ต์ ๊ตฌํ๊ธฐ ์ํจ์ด๋ค.
03) ์ฝ๋(ํ์ด์ฌ)
import sys
N, C = map(int, input().split())
X = [int(sys.stdin.readline()) for _ in range(N)]
X.sort()
upper = X[-1]-X[0]
lower = 1
s, e = lower, upper
while s <= e:
mid = (s+e) // 2
cnt = 1
diff = upper
curr = X[0]
for i in range(1, N):
if X[i]-curr >= mid:
diff = min(diff, (X[i]-curr))
cnt += 1
curr = X[i]
if cnt < C:
e = mid-1
else:
s = mid+1
lower = max(lower, diff)
print(lower)
'DevLog ๐จ > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DevLog][Baekjoon] 1655: ๊ฐ์ด๋ฐ๋ฅผ ๋งํด์ (0) | 2023.08.20 |
---|---|
[DevLog][Baekjoon] 8983: ์ฌ๋ฅ๊พผ (0) | 2023.08.16 |
[DevLog][Baekjoon] 2261: ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ (0) | 2023.08.14 |
[DevLog][Baekjoon] 1629: ๊ณฑ์ (0) | 2023.08.14 |
[BaekJoon] 1007: ๋ฒกํฐ ๋งค์นญ (0) | 2023.02.16 |