[프로그래머스] 과제 진행하기
사용 언어: Python3, Java
문제
풀이
나의 풀이
def solution(plans):
def timeToMin(str):
hh, mm = map(int, str.split(':'))
return hh * 60 + mm
plans.sort(key=lambda x:x[1]) # 시작 시간 순으로 오름차순 정렬
for x in plans:
x[1], x[2] = timeToMin(x[1]), int(x[2])
print(plans)
stack = [] # 멈춘 과제
ans = [] # 끝낸 과제
now = plans[0][1] # 현재 시간
for i in range(len(plans)):
if i == len(plans) - 1: # 마지막 과제는 무조건 마칠 수 있다 (뒤에 시작해야하는 과제가 없기 때문)
ans.append(plans[i][0])
while stack: # stack에 남은 과목 모두 처리
ans.append(stack.pop()[0])
break
if now + plans[i][2] > plans[i+1][1]: # 과제를 끝마치기에 시간이 부족한 경우
plans[i][2] -= (plans[i+1][1] - plans[i][1]) # 할 수 있는데까지 하고 stack에 넣기
now += (plans[i+1][1] - plans[i][1]) # 현재 시간 갱신
stack.append([plans[i][0], plans[i][2]])
elif now + plans[i][2] <= plans[i+1][1]: # 과제를 끝마칠 수 있는 경우
now += plans[i][2]
ans.append(plans[i][0]) # ans에 넣기
if now < plans[i+1][1]: # 만약 시간이 남는다면
while stack: # stack 돌면서 처리
name, remain_time = stack.pop() # 과목이름, 남은시간
if now + remain_time > plans[i+1][1]: # 끝마치기에 시간이 부족한 경우
remain_time -= (plans[i+1][1] - now)
now += (plans[i+1][1] - now) # 현재 시간 갱신
stack.append([name, remain_time]) # 할 수 있는데까지 하고 다시 stack에 넣기
break
elif now + remain_time <= plans[i+1][1]: # 끝마칠 수 있는 경우
now += remain_time # 현재 시간 갱신
ans.append(name) # 뺀 item을 ans에 넣는다 (stack에는 다시 넣지 않는다)
if now == plans[i+1][1]:
break # 시간이 남으면 break 하지 않고 계속해서 stack을 돈다
return ans
- 테스트 케이스: 성공
- 제출 결과: 실패
다른 풀이
def solution(plans):
for x in plans:
hh, mm = map(int, x[1].split(':'))
x[1], x[2] = hh * 60 + mm, int(x[2])
plans.sort(key=lambda x:x[1]) # 시작 시간 순으로 오름차순 정렬
ans = [] # 끝낸 과제
stack = [] # 멈춘 과제
for i in range(len(plans)):
if i == len(plans) - 1:
ans.append(plans[i][0])
while stack: # stack에 남은 과목 모두 처리
ans.append(stack.pop()[0])
break
name, start, playtime = plans[i]
nx_name, nx_start, nx_playtime = plans[i+1] # 다음 과제
if start + playtime <= nx_start: # 과제를 끝마칠 수 있는 경우
ans.append(name)
remain_time = nx_start - (start + playtime) # 다음 과제 시작 전까지 남는 시간
while stack and remain_time != 0:
stk_name, stk_start, stk_playtime = stack.pop() # 멈춘 과제
if remain_time >= stk_playtime: # 멈춘 과제를 끝마칠 수 있는 경우
ans.append(stk_name)
remain_time -= stk_playtime
else: # 멈춘 과제를 끝마칠 수 없는 경우
stack.append([stk_name, stk_start, stk_playtime - remain_time]) # 다시 stack 에 넣기
remain_time = 0 # while문 탈출 조건
else: # 과제를 끝마칠 수 없는 경우
plans[i][2] = playtime - (nx_start - start) # 남은 시간 갱신
stack.append(plans[i]) # 하는데까지 하고 stack 에 넣기
return ans
- 테스트 케이스: 통과
- 제출 결과: 성공
💛 개인 공부 기록용 블로그입니다. 👻