알고리즘[Python]/프로그래머스
[ Lv 3 ] [ 1차 ] 셔틀버스
병훈1234
2021. 7. 20. 10:55
풀이 과정
- 탑승객 정보를 분단위로 변환 및 정렬
- 탑승객 정보를 큐에 삽입한다.
- 셔틀을 하나씩 도착시키면서 인원수 비교
- 현재 셔틀에 탑승가능하면 큐에서 빼줌
- 이 때, 탑승 가능한 최대 인원수가 된다면 그 때의 탑승객보다 1분 빨리 오면 된다.
- 마지막으로, 셔틀에 빈자리가 있는 경우
- 막차라면, 해당 셔틀 도착 시간에 무조건 타야 함
소스 코드
from collections import deque
def convert(time):
return 60 * int(time[:2]) + int(time[3:])
def solution(n, t, m, timetable):
answer = -1
cv_time = []
for time in timetable:
cv_time.append(convert(time))
cv_time.sort()
queue = deque(cv_time)
time = convert("09:00")
total_people = n * m
people = 0
for i in range(n):
shuttle = time + (t * i) # 현재 도착한 셔틀 시간
curr_count = 0
# 현재 시간에 탑승가능한 인원 탑승
while queue and queue[0] <= shuttle and curr_count < m:
curr_count += 1
# 현재 인원이 탑승했을 때, 최대 인원수가 된다면 1분 전에 서있어야 함
if people + curr_count == total_people:
answer = queue[0] - 1
break
queue.popleft()
# 현재 인원수가 탑승가능 인원수보다 적다면 맞춰줌
if curr_count < m:
curr_count = m
# 현재 셔틀이 빈자리가 있으면서 마지막 셔틀이라면 도착시간에 타야 함
if answer == -1 and people + curr_count >= total_people:
answer = time + (t * i)
# 정답을 구했으면 break
if answer != -1:
break
people += curr_count
if answer == -1:
answer = time + (t * (n-1))
# 시간 변환
temp = answer
answer = str(temp // 60).zfill(2)
answer += ':'
temp = temp % 60
answer += str(temp).zfill(2)
return answer
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges