반응형
https://www.acmicpc.net/problem/3079
3079번: 입국심사
첫째 줄에 N과 M이 주어진다. (1 ≤ N ≤ 100,000, 1 ≤ M ≤ 1,000,000,000) 다음 N개 줄에는 각 심사대에서 심사를 하는데 걸리는 시간인 Tk가 주어진다. (1 ≤ Tk ≤ 109)
www.acmicpc.net
해결 방법 : 이분탐색
- M과 Tk가 1 <= M, Tk <= 1,000,000,000 으로 주어지므로, 모든 친구들이 입국심사를 통과하는데 걸린 시간 time은 최악의 경우(if N:1, M:max, T1:max) 1,000,000,000,000,000,000이 된다 ^^. 하지만 이분탐색을 사용하면 최악의 케이스라고 해도 60번 정도만 탐색하면 된다.
- 임의의 시간 time 동안 입국심사할 수 있는 인원을 기준으로 이분탐색하면 될 것이다.
- time 동안 최대 통과 인원, check(time) = sum([time // t for t in T])
- 유의할 점은 이분탐색시 target 인원 M을 max쪽에 포함시켜야 추가 작업 없이 값을 도출할 수 있다.
- check(time) == M인 경우에 time 보다 작거나 같은 값이 최종값이 될 것이기 때문이다.
import sys
input = sys.stdin.readline
def solution(N, M, T):
mn = 0
mx = 10**18 # 주어진 조건에 따라 최악의 mx 설정
def check(time): # time 동안 최대 몇명이 입국심사를 통과하는지 반환
return sum([time // t for t in T])
while mn < mx - 1:
mid = (mn + mx) // 2
if check(mid) < M:
mn = mid
else:
mx = mid
return mx
if __name__ == '__main__':
N, M = map(int, input().split())
T = [int(input()) for i in range(N)]
result = solution(N, M, T)
print(result)
반응형
'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글
백준 2800 : 괄호 제거 (0) | 2021.06.19 |
---|---|
백준 18352 : 특정 거리의 도시 찾기 (0) | 2021.06.18 |
백준 1789 : 수들의 합 (0) | 2021.06.18 |
백준 21608 : 상어 초등학교 (0) | 2021.06.13 |
백준 11728 : 배열 합치기(feat. Tim sort) (0) | 2021.06.09 |