728x90
[사용한 알고리즘]
이분 탐색(binary search)
[문제 접근]
N명의 아이들을 놀이기구에 태울 수 있는 시간을 구한 후 놀이기구의 번호를 구하였습니다. N의 범위가 크기 때문에 0초부터 시간을 탐색하는 것이 아니라 이분 탐색으로 시간을 구하였습니다.
[알고리즘]
1. 놀이기구의 수보다 아이들의 수가 적으면 아이들의 수를 출력합니다.
2. 이분 탐색을 통해 아이들을 모두 태울 수 있는 시간을 찾습니다.
3. 구한 시간 - 1분까지 몇 명의 아이를 태울 수 있는지 탐색합니다.
4. 구한 시간에 탑승하는 아이들을 계산하면서 제일 마지막에 탑승하는 놀이기구의 번호를 출력합니다. (놀이기구 탑승 인원이 N명이 될 때의 놀이기구 번호를 출력하면 됩니다)
[코드]
import sys
if __name__ == "__main__":
n, m = map(int, sys.stdin.readline().split())
t_list = list(map(int, sys.stdin.readline().split()))
if n < m:
print(n)
else:
# 이분 탐색
left, right = 0, 60000000000
t = None
while left <= right:
mid = (left + right) // 2
cnt = m
for i in range(m):
cnt += mid // t_list[i]
if cnt >= n: # n명을 태울 수 있는 상황
t = mid
right = mid - 1
else:
left = mid + 1
# t - 1에 탑승한 아이들의 숫자를 계산한다.
cnt = m
for i in range(m):
cnt += (t - 1) // t_list[i]
# t에 탑승한 아이를 계산한다.
for i in range(m):
if t % t_list[i] == 0: # t 시간에 탑승한 아이
cnt += 1
if cnt == n:
print(i + 1)
break
728x90
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준 1600] 말이 되고픈 원숭이 - Python (0) | 2021.01.03 |
---|---|
[백준 5719] 거의 최단 경로 - Python (2) | 2021.01.02 |
[백준 4256] 트리 - Python (0) | 2021.01.01 |
[백준 2887] 행성 터널 - Python (0) | 2020.12.30 |
[백준 1918] 후위 표기식 - Python (0) | 2020.12.29 |