풀이 과정
- 탑승객 정보를 분단위로 변환 및 정렬
- 탑승객 정보를 큐에 삽입한다.
- 셔틀을 하나씩 도착시키면서 인원수 비교
- 현재 셔틀에 탑승가능하면 큐에서 빼줌
- 이 때, 탑승 가능한 최대 인원수가 된다면 그 때의 탑승객보다 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
'알고리즘[Python] > 프로그래머스' 카테고리의 다른 글
[ Lv 3 ] 단속카메라 (0) | 2021.07.21 |
---|---|
[ Lv 3 ] 가장 긴 팰린드롬 (0) | 2021.07.20 |
[ Lv 3 ] [ 1차 ] 추석 트래픽 (0) | 2021.07.19 |
[ Lv 3 ] 광고 삽입 (0) | 2021.07.19 |
[ Lv 3 ] 숫자 게임 (0) | 2021.07.18 |