[프로그래머스] 과제 진행하기
사용 언어: Python3, Java
문제
풀이
나의 풀이
def solution(n, t, m, timetable):
def timeToMin(str):
hh, mm = map(int, str.split(':'))
return hh * 60 + mm
def minToTime(n):
return '{0:02d}'.format(n//60) + ':' + '{0:02d}'.format(n%60)
for i in range(len(timetable)):
timetable[i] = timeToMin(timetable[i])
timetable.sort()
busTime = [] # 버스가 도착하는 시간
for i in range(n):
busTime.append(540 + i * t)
is_space, last_ride_mm = True, 0 # 버스 자리 남았는지, 마지막 크루가 버스에 탄 시간
isRide = [0] * len(timetable) # timetable에 있는 크루들이 버스 탔는지 체크
for x in busTime: # 모든 버스 순회하면 is_space, last_ride_mm은 "마지막 버스" 기준이 된다
cnt = 0 # 탑승 인원
for i in range(len(timetable)):
if isRide[i]: # 이미 탑승한 사람은 패스
continue
if not is_space: # 만차라면 패스
continue
if timetable[i] <= x: # 버스 도착 전에 왔으면 탑승
isRide[i] = 1 # 탑승
cnt += 1
if cnt >= m: # 만차
is_space = False
last_ride_mm = timetable[i]
ans = 0
if is_space: # 자리가 남았다면 콘은 버스 도착 시간까지만 오면 된다
ans = busTime[-1]
else: # 자리가 안남았다면 마지막 크루가 탄 시간보다 1분 일찍 와야한다
ans = last_ride_mm - 1
return minToTime(ans)
- 테스트 케이스: 성공
- 제출 결과: 실패
다른 풀이
def solution(n, t, m, timetable):
def timeToMin(str):
hh, mm = map(int, str.split(':'))
return hh * 60 + mm
def minToTime(n):
return '{0:02d}'.format(n//60) + ':' + '{0:02d}'.format(n%60)
# 크루 도착 시각 리스트
crewTime = [timeToMin(time) for time in timetable]
crewTime.sort()
# 버스 도착 시각 리스트
busTime = [540 + i * t for i in range(n)]
idx = 0 # 다음에 버스에 오를 크루의 인덱스
answer = 0
for x in busTime:
cnt = 0 # 버스에 타는 크루 수
while cnt < m and idx < len(crewTime) and crewTime[idx] <= x:
idx += 1
cnt += 1
if cnt < m: # 자리가 남았다면 콘은 버스 도착 시간까지만 오면 된다
answer = x
else: # 자리가 안남았다면 마지막 크루가 탄 시간보다 1분 일찍 와야한다
answer = crewTime[idx-1] - 1 # idx는 +1 된 상태이기 때문에 -1로 다시 돌리기
return minToTime(answer)
- 테스트 케이스: 통과
- 제출 결과: 성공
💛 개인 공부 기록용 블로그입니다. 👻