일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- brute force
- 최단경로
- 라이브템플릿
- 탐욕법
- API
- 2018 KAKAO BLIND RECRUITMENT
- Python
- BFS
- beandefinitionstoreexception
- 소수
- counting elements
- 2981
- error
- 알고리즘
- 백준
- codility
- 문자열
- Greedy
- java
- applicationeventpublisher
- springboot
- Spring
- javascript
- HTTP
- 프로그래머스
- Dijkstra
- spring security
- 파이썬
- 코딩테스트
- algorithm
Archives
- Today
- Total
Altiora Petamus
셔틀버스 본문
Reference
https://programmers.co.kr/learn/courses/30/lessons/17678?language=python3
아래 풀이 방법은 제가 푼 방식으로 정해와는 차이가 있을 수 있습니다.
문제 풀이
언뜻 보기엔 쉬워보였지만 문제의 의미나 입출력의 상관관계를 이해하기가 힘들어서 생각보다 오래 걸렸던 것 같다.
해결하기 위한 순서는 다음과 같다.
- 시간을 비교해주기 위해서 문자열로 된 시간 단위를 분으로 변환한다.
- 정규식 활용
- waiting 이라는 배열을 선언해주고 이 안에 분으로 변환된 시간을 오름차순으로 정렬하여 담아둔다.
- 셔틀의 운행횟수만큼 반복하면서 대기열에서 차례대로 셔틀에 탑승시킨다.
- 마지막 셔틀에 자리가 남는다면 콘은 마지막 셔틀의 도착시간에 대기열에 들어가면 된다.
- 자리가 남지 않는다면 마지막으로 셔틀에 타게 되는 사람보다 콘을 1분 일찍 오게 한다.
- 분으로 바꿨던 시간을 다시 출력형식에 맞게 포맷팅해준다.
# 2018 kakao blind recruitment
# level 3
import re
from collections import deque
def solution(n, t, m, timetable):
# 시간을 분단위로 변경
con_waiting_time = 0
waiting = []
regex = re.compile('\D')
for time in timetable:
hour_min = regex.split(time)
waiting.append(int(hour_min[0]) * 60 + int(hour_min[1]))
waiting = sorted(waiting) # 온 순서대로 세우기
# 버스는 9시부터 온다. (540분)
start_time = 540
# 셔틀 운행 횟수만큼 반복
# 만약 마지막 셔틀에 자리가 남는다면 콘은 그 셔틀의 도착시간에 대기열에 들어가면 된다.
# 자리가 남지 않는다면
# => 마지막에 줄을 서는 사람보다 1분만 빨리오게 하면 된다.
for driving in range(n):
# bus 최대 인원 설정
# FIXME: 굳이 queue 를 사용하지 않아도 해결할 수 있다. 잘 생각해보면 반복문도 없앨 수 있을 것 같다.
bus = deque(maxlen=m)
for _ in range(m):
if not waiting:
break
if waiting[0] <= start_time:
passenger_crew = waiting.pop(0)
bus.append(passenger_crew)
start_time += t
# 마지막 버스 남는 자리 체크 후 꽉 차있으면 콘의 도착 시간 설정
if len(bus) == m:
con_waiting_time = bus.pop() - 1
else: # 꽉 차있지 않으면 버스의 마지막 도착시간을 콘의 시간으로 설정
con_waiting_time = start_time - t
# formatting
hour = con_waiting_time // 60
minute = con_waiting_time % 60
if hour < 10:
hour = '0' + str(hour)
else:
hour = str(hour)
if minute < 10:
minute = '0' + str(minute)
else:
minute = str(minute)
answer = hour + ':' + minute
return answer
'1day-1algorithm' 카테고리의 다른 글
좌표 정렬하기 (0) | 2021.05.16 |
---|---|
부녀회장이 될테야 (0) | 2021.05.07 |
신규 아이디 추천 (0) | 2021.04.23 |
ACM 호텔 (0) | 2021.04.20 |
달팽이는 올라가고 싶다 (0) | 2021.04.19 |