일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 2018 KAKAO BLIND RECRUITMENT
- 2021 KAKAO BLIND RECRUITMENT
- SWEA
- 우선순위큐
- 비트마스킹
- 투 포인터
- 다익스트라
- 브루트포스
- 트라이
- 프로그래머스
- 2020 카카오 인턴십
- 플로이드와샬
- 구현
- 크루스칼
- 시뮬레이션
- 조합
- 플로이드 와샬
- 최소 신장 트리
- 로봇 청소기
- 스택
- 백트래킹
- Spring
- 파이썬
- 이분탐색
- 백준
- 투포인터
- 2020 KAKAO BLIND RECRUITMENT
- BFS
- GIT
- 2019 KAKAO BLIND RECRUITMENT
- Today
- Total
개발조아
[프로그래머스] 셔틀버스 파이썬 본문
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17678
시간 관련 구현문제이긴하나 시간은 간단했다.
일단 timetable의 시간을 분으로 바꾼 후 정렬하자.
9시에서 부터 시작하여 t 시간만큼 도착시간을 증가시키고 총 n번 수행하면서 사람들을 태우자.
이제 도착시간을 기준으로 timetable에서 사람들을 태우자.
이때 timetable에서 시간을 체크하여 출발시간보다 작거나 같다면 개수를 세주자.
그리고 인덱스는 0부터 시작하는데 위에서 세준 개수를 가지고 조정해가며 최대 m명까지 태울수 있으므로 현재 인덱스+m명까지 반복문을 돌리자.
만약 처음에 9시에 세사람이 도착했다면 다음번 셔틀의 도착시간을 체크할때는 3부터 시작하여 3+m까지 확인하면 된다.
이때 도착시간보다 크거나, timetable 범위를 벗어나면 반복문을 종료해주자.
위에서 세준 타는 사람을 기준으로 남은 사람을 조정해주자.
그리고 남은 사람이 0명이라면 콘이 탈 차례이다.
이때 다음 셔틀이 아직 남아 있다면 마지막 셔틀에 태우도록 하자.
그게 아니고 마지막 셔틀이라면
현재 셔틀에 탄 인원이 m명 보다 작다면 현재 셔틀의 도착시간으로 하면 된다.
그것도 아니고 다 탔다면 마지막 탄사람의 -1을 수행하면 된다.
나는 위에서 timetable의 인덱스와 개수를 세주었다.
그렇기 때문에 timetable[idx+cnt-1]-1을 하면 된다.
이제 마지막으로 모든 셔틀을 다 돌았는데 아직 대기하고 있는 사람들이 있을 경우이다.
한사람도 타지 못했다면 콘은 마지막 셔틀도착시간에 타면 된다.
그렇지 않을 때
이전 셔틀에 탄 사람의 수가 m과 같다면 마지막 탄사람의 시간-1을하면 되고
그게아니라면 도착시간에 타면 된다.
설명이 길지만 코드를 보면 금방 이해가 갈 것이다.
def solution(n, t, m, timetable):
answer = ''
for idx in range(len(timetable)):
timetable[idx] = time_to_minute(timetable[idx])
timetable.sort()
start = 540
idx = 0
total = len(timetable)
before = 0
for bus in range(n):
cnt = 0
for time_idx in range(idx,idx+m):
if time_idx >= len(timetable):
break
if timetable[time_idx] <= start:
cnt += 1
else:
break
total -= cnt
before = cnt
if total == 0:
if bus < n-1:
return minute_to_time(start+t*(n-1-bus))
else:
if cnt < m:
return minute_to_time(start)
else:
return minute_to_time(timetable[idx+cnt-1]-1)
start += t
idx += cnt
start -= t
if idx == 0:
return minute_to_time(start)
else:
if before == m:
answer = timetable[idx-1]-1
return minute_to_time(answer)
else:
return minute_to_time(start)
def minute_to_time(m):
return '%02d:%02d'%(divmod(m,60))
def time_to_minute(t):
return int(t.split(':')[0])*60+int(t.split(':')[1])
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 보석 쇼핑 파이썬 (0) | 2021.11.26 |
---|---|
[프로그래머스] 아이템 줍기 파이썬 (0) | 2021.10.23 |
[프로그래머스] 방금그곡 파이썬 (0) | 2021.10.02 |
[프로그래머스] 빛의 경로 사이클 파이썬 (0) | 2021.10.01 |
[프로그래머스] 표 편집 파이썬 (0) | 2021.10.01 |