-
[Binary Search] BOJ 2110 ๊ณต์ ๊ธฐ ์ค์นAlgorithms in Python/baekjoon 2021. 1. 24. 14:51
๐ ๋ฐฑ์ค 2110 ๊ณต์ ๊ธฐ ์ค์น
๋ฌธ์
๋ํ์ด์ ์ง N๊ฐ๊ฐ ์์ง์ ์์ ์๋ค. ๊ฐ๊ฐ์ ์ง์ ์ขํ๋ x1, ..., xN์ด๊ณ , ์ง ์ฌ๋ฌ๊ฐ๊ฐ ๊ฐ์ ์ขํ๋ฅผ ๊ฐ์ง๋ ์ผ์ ์๋ค.
๋ํ์ด๋ ์ธ์ ์ด๋์๋ ์์ดํ์ด๋ฅผ ์ฆ๊ธฐ๊ธฐ ์ํด์ ์ง์ ๊ณต์ ๊ธฐ C๊ฐ๋ฅผ ์ค์นํ๋ ค๊ณ ํ๋ค. ์ต๋ํ ๋ง์ ๊ณณ์์ ์์ดํ์ด๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์, ํ ์ง์๋ ๊ณต์ ๊ธฐ๋ฅผ ํ๋๋ง ์ค์นํ ์ ์๊ณ , ๊ฐ์ฅ ์ธ์ ํ ๋ ๊ณต์ ๊ธฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ ํฌ๊ฒ ํ์ฌ ์ค์นํ๋ ค๊ณ ํ๋ค.
C๊ฐ์ ๊ณต์ ๊ธฐ๋ฅผ N๊ฐ์ ์ง์ ์ ๋นํ ์ค์นํด์, ๊ฐ์ฅ ์ธ์ ํ ๋ ๊ณต์ ๊ธฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ต๋๋ก ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ง์ ๊ฐ์ N (2 ≤ N ≤ 200,000)๊ณผ ๊ณต์ ๊ธฐ์ ๊ฐ์ C (2 ≤ C ≤ N)์ด ํ๋ ์ด์์ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ง์ ์ขํ๋ฅผ ๋ํ๋ด๋ xi (0 ≤ xi ≤ 1,000,000,000)๊ฐ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฐ์ฅ ์ธ์ ํ ๋ ๊ณต์ ๊ธฐ ์ฌ์ด์ ์ต๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค.
โ ๋ฌธ์ ์ ํต์ฌ, ํ์ด ๊ณผ์
• ๊ฐ์ฅ ์ธ์ ํ ๋ ๊ณต์ ๊ธฐ ์ฌ์ด์ ์ต๋๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผ ํ๋ค.
=> ๊ฐ ์ง์ ์ขํ์ ํ์๋ฒ์๊ฐ 1,000,000,000 (ํฐ ํ์๋ฒ์ -> ์ด์งํ์์ ๋ ์ฌ๋ฆฐ๋ค)
- ๊ฐ์ฅ ์ธ์ ํ ๋ ๊ณต์ ๊ธฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด์งํ์์ ์งํํ๋ค.
- start: ๊ฐ๋ฅํ ๊ณต์ ๊ธฐ์ ์ต์๊ฑฐ๋ฆฌ(1), end: ๊ฐ๋ฅํ ๊ณต์ ๊ธฐ์ ์ต๋๊ฑฐ๋ฆฌ(arr[-1] - arr[0])
- mid ๊ฐ์ ์ด์ฉํด ๊ณต์ ๊ธฐ๋ฅผ ์ค์นํ๋ค.
• ๊ณต์ ๊ธฐ๋ ์ง์ ํ๋๋ง ์ค์นํ ์ ์์ผ๋ฉฐ, ์ด C๊ฐ๋ฅผ ์ค์นํ์ฌ์ผ ํ๋ค.
=> ํ์๊ณผ์ ์์ C๊ฐ๋ฅผ ์ค์นํ ์ ์๋์ง ํ์ธํด์ผ ํ๋ค.
- C๊ฐ ์ด์์ ๊ณต์ ๊ธฐ๋ฅผ ์ค์นํ ์ ์๋ ๊ฒฝ์ฐ, ๊ฐ์ฅ ์ธ์ ํ ๋ ๊ณต์ ๊ธฐ ์ฌ์ด์ ์ต๋๊ฐ์ ์ฐพ์์ผ ํ๋ค.
-> ๊ฑฐ๋ฆฌ๋ฅผ ์ฆ๊ฐ์์ผ์ผ ํ๋ค. (start = mid + 1)
- C๊ฐ ์ด์์ ๊ณต์ ๊ธฐ๋ฅผ ์ค์นํ ์ ์๋ ๊ฒฝ์ฐ
-> ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์์์ผ์ผ ํ๋ค. (end = mid - 1)
โ ์ ์ฒด ์ฝ๋
import sys input = sys.stdin.readline n, c = map(int, input().split()) arr = [0] * n for i in range(n): arr[i] = int(input()) arr.sort() # ์ต๋ ์ต์ ๊ฑฐ๋ฆฌ(๊ฐ์ฅ ์ธ์ ํ ๋ ๊ณต์ ๊ธฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ gap) start = 1 # ๊ฐ๋ฅํ ์ต์ ๊ฑฐ๋ฆฌ end = arr[-1] - arr[0] # ๊ฐ๋ฅํ ์ต๋ ๊ฑฐ๋ฆฌ result = 0 while start <= end: mid = (start + end) // 2 val = arr[0] cnt = 1 # ๋งจ ์ฒ์ ๊ณต์ ๊ธฐ # ๊ณต์ ๊ธฐ ์์์๋ถํฐ ์ค์น for i in range(1, n): if arr[i] >= val + mid: val = arr[i] cnt += 1 # c๊ฐ์ด์ ์ค์นํ ์ ์๋์ง ํ์ธ if cnt >= c: # ์ค์นํ ์ ์๋ ๊ฒฝ์ฐ gap ์ฆ๊ฐ์ํจ๋ค. start = mid + 1 result = mid else: # ์ค์นํ ์ ์๋ ๊ฒฝ์ฐ gap์ ๊ฐ์์ํจ๋ค. end = mid - 1 print(result)
* ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ - ๋๋๋น
'Algorithms in Python > baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DFS/BFS] BOJ 18405 ๊ฒฝ์์ ์ ์ผ (0) 2021.02.01 [DFS/BFS] BOJ 16234 ์ธ๊ตฌ ์ด๋ (0) 2021.02.01 [Binary Search] BOJ 2470 ๋ ์ฉ์ก (0) 2021.01.27 [Backtracking] BOJ 2580 ์ค๋์ฟ (0) 2021.01.19 [DP] ์ฐ์ํ๋ ๊ฒ์ ์ ํํ ์ ์์ ๋ (BOJ 2579, 2156) (0) 2021.01.18