티스토리 뷰
반응형
문제
programmers.co.kr/learn/courses/30/lessons/17678
문제 상황
- 버스 이동 시간과 배차 간격이 주어지고 이를 이용해 최소한 막차를 타며 최대한 늦게 버스정류장에 나가야 하는 시간을 구하는 문제이다.
해결 전략
- 문제 상황을 그대로 시뮬레이션한다. 단, 예외 처리와 문제가 되는 상황을 정확히 파악하여야한다.
코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
from collections import deque
def solution(n, t, m, timetable):
for i in range(len(timetable)):
hh, mm = timetable[i].split(":")
timetable[i] = int(hh)*60 + int(mm)
timetable.sort()
timetable = deque(timetable)
# 버스 시작시간
start_bus = 540
# 막차시간
last_bus = start_bus + t*(n-1)
# 체크할 m을 저장
check = m
# 마지막 버스이후에 온 사람이 대기열 제일 첫번째면 그냥 막차시간에 타면 된다.
if timetable[0] > last_bus:
hh, mm = divmod(last_bus,60)
return f"{hh:#02d}:{mm:#02d}"
else:
while True:
if n != 1:
# 만약 버스 시간보다 대기 시간이 더 빠르다면 대기열에서 제거해준다.
if timetable[0] <= start_bus and check > 0:
timetable.popleft()
# 한명이 탔다
check -= 1
# 버스에 탈 사람이 없거나 버스에 좌석이 없다면
else :
# 다음 버스로 이동
start_bus += t
# 남은 버스의 수를 하나 줄인다.
n -= 1
# 다시 좌석수를 리셋
check = m
# 막차가 되었을 때
else:
# 아직 대기하는 사람이 있으면
if len(timetable) != 0 :
# 대기열 1번째 사람이 버스시간보다 늦게온다면
if timetable[0] > start_bus:
# 버스 도착시간에 나온다.
hh, mm = divmod(start_bus,60)
return f"{hh:#02d}:{mm:#02d}"
# 대기열 1번째 사람이 버스시간보다 일찍 나온다면
else:
# 좌석이 한자리 남은게 아니면
if check != 1:
# 대기하는 사람을 태운다.
timetable.popleft()
check -= 1
# 좌석이 한자리 남았으면
else:
# 처음사람보다 1분은 먼저 와야한다.
hh, mm = divmod(timetable[0]-1,60)
return f"{hh:#02d}:{mm:#02d}"
# 이제 대기하는 사람이 없으면
else :
hh, mm = divmod(start_bus,60)
return f"{hh:#02d}:{mm:#02d}"
|
cs |
해설
- 코드에 해설 첨언
새로 학습한 것 & 실수
- deque은 sort 할 수 없다.(내부적으로 이중 연결 리스트이기 때문에)
- f-string으로 자리수를 표현할 때 f"{변수:#02d}:{변수:#02d}"
- 조건에 따라 나누어 구현하면서 한가지 상황을 간과하였다. (39~42번 줄)
- 가장 처음에는 차 시간보다 가장 최근에 나와서 기다린 사람이 늦게 나온 상황을 계산했지만 조건을 나누어 상황을 설정하며 한가지 상황을 빼먹었다. 막차가 왔을 때 기다리는 사람이 있는데 그 사람이 그 다음차보다 늦게 나온 상황을 생각하지 못했다.
- 한번 코드를 짜놓고 일부 상황에서만 오류가 나면 패닉에 빠진다. 특히 예시는 다 통과할 때에는 내가 예시를 만들기 어려워 더 그런 경향이 있다. 그럴 때에는 차분하게 다시 코드를 보지말고 문제 상황을 이해하고 시뮬레이션한다. 그리고 코드의 흐름을 잡고 코드를 본다. 그 후에도 못찾으면 예시를 이용해 디버그한다.
반응형
'알고리즘 학습 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 무지의 먹방 라이브 [Python] (0) | 2020.09.11 |
---|---|
프로그래머스 - 조이스틱 [Python] (0) | 2020.09.10 |
프로그래머스 - 보석 쇼핑 [Python] (0) | 2020.09.10 |
프로그래머스 - 징검다리 건너기 [Python] (0) | 2020.09.09 |
프로그래머스 - 추석 트래픽 [Python] (0) | 2020.09.08 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Triangle#Sorting#Codility#Python
- 나무자르기#BOJ#이분탐색#Python
- N으로 표현#DP#Programmers#Python
- 종이자르기#분할정복#BOJ#Python
- filter#isalnum#lower
- 순열사이클#BOJ#Python
- 날짜 계산#BOJ#완전탐색#Python
- 랜선자르기#이분탐색#BOJ#Python
- Swift#Tuples#Range
- 병든 나이트#BOJ#탐욕법#Python
- Distinct#Codility#Python
- 배열합치기#분할정복#BOJ#Python
- 파이썬알고리즘인터뷰#4장
- Brackets#Stacks and Queues#Codility#Python
- 쿼드트리#BOJ#분할정복#Python
- NumberofDiscIntersections#Codility#Sort#Python
- django
- 리모컨#완전탐색#BOJ#Python
- 공유기 설치#BOJ#이분탐색#Python
- 백준 알고리즘#BackTracking
- 터틀비치#리콘#xbox#controller
- django#slicing
- 반복수열#백준알고리즘#Python
- 암호코드#dp#BOJ#Python
- API#lazy#
- 미로 탐색#백준알고리즘#Python
- PassingCars#Codility#Python
- 섬의개수#백준알고리즘#Python
- 토마토#백준알고리즘#Python
- 텀 프로젝트#백준알고리즘#Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함