728x90
난이도 : Lv. 3
풀이일 : 2501201
https://school.programmers.co.kr/learn/courses/30/lessons/17678
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
아이디어
- 전체 버스 시간을 숫자로 변환해서 쉽게 비교하자
- 각 버스 시간에 버스를 타고 간 크루의 인덱스를 저장하자
- 막차에 자리가 있다면, 막차 시간에 도착하자
- 막차에 자리가 없다면 마지막 사람보다 1분 먼저 도착하자
코드
def solution(n, t, m, timetable):
bus, now = 0, 540 - t
crew = 0 # 인덱스로 몇 번째 도착한 크루 버스 탔는지 기록
lastseat = True
# timetable 숫자 변환 및 정렬
timetable = [int(time[:2]) * 60 + int(time[3:]) for time in timetable]
timetable.sort()
while bus < n: # 각 버스에 타는 크루 구하기
now += t
num = 0
while crew + num < len(timetable) and num < m:
if timetable[crew + num] > now: # 현재 버스 떠나고 온 사람 발견 -> 중지
break
num += 1
if bus + 1 == n and num == m: # 막차에 자리 없음
lastseat = False
crew += num
bus += 1
# 막차에 자리 있다면 막차, 자리 없다면 막차 탄 마지막 사람보다 1분 빨리 도착
answer = now if lastseat else timetable[crew - 1] - 1
return f'{str(answer // 60).zfill(2)}:{str(answer % 60).zfill(2)}'
- lastseat : 막차에 자리가 있는지 확인
- timetable : 모두 숫자로 변환해 9시인 540부터 각 셔틀버스 도착시간과 비교한다. 비교를 위한 정렬 필요
- while bus < n : 각 버스에 타는 크루를 구해 탄 크루의 인덱스를 crew로 저장
- while crew + num < len(timetable) and num < m : 현재 버스에 탈 수 있는 사람들 탑승여부 판단
- if timetable[crew + num] > now : 현재 버스 출발 시간보다 도착시간이 늦은 사람을 발견했으므로 중단 조건
- 막차면서, 탈 수 있는 사람이 다 탔으면 막차에 자리가 없다.
- 막차에 자리가 있다면 막차 시간 출력, 없다면 마지막 사람보다 1분 빨리 도착
제출 결과
느낀점
- zfill() 오랜만에 써봐서 헤맸다.
- 어렵지도 않은데 왜 이렇게 오래풀었지 천천히 꼼꼼하게 조건을 보면서 로직을 세우고 코드를 짜자
- 그리고 코드가 깔끔하지 않아서 마음에 안 든다. 다음에 고쳐봐야지
'알고리즘 > Lv. 3' 카테고리의 다른 글
프로그래머스 17678 셔틀버스 자바스크립트 풀이 (1) | 2025.01.21 |
---|---|
프로그래머스 17678 셔틀버스 자바 풀이 (0) | 2025.01.20 |
프로그래머스 12927 야근 지수 파이썬 풀이 (0) | 2025.01.20 |
프로그래머스 12907 거스름돈 자바 풀이 (1) | 2024.12.27 |
프로그래머스 12907 거스름돈 자바스크립트 풀이 (0) | 2024.12.27 |