문제
요약
* 1. 정해진 시간이 되면 과제를 시작한다.
* 2. 진행중이던 건 멈춘다.
* 3. 정해둔거 끝나면 멈춰둔거 한다
* 4. 멈춰둔거 여러개면 마지막에 하던거 한다 => 스택
접근
'''
CASE 1. done : 다음꺼까지 남은 시간 >= 소요시간
1-1. wait 리스트 소모
CASE 2. not done : 다음꺼까지 남은 시간 < 소요시간
2-1. wait 으로 넘김
남은 시간 업데이트
'''
def solution(plans):
# 과목 , 시작, 소요시간
def getTime(time_str):
h, m = map(int, time_str.split(':'))
time_int = h*60+m
return time_int
wait = []
done = []
plans = sorted([[t, getTime(x), int(d)] for t,x,d in plans],key=lambda x: x[1]) + [["",24*60,100 ]]
board = {title: res for title, _, res in plans}
for idx, item in enumerate(plans[:-1]):
title, start_at, duration = item
next_start_at = plans[idx+1][1]
term = next_start_at - start_at
if term < duration: # CASE 2
wait.append(title)
board[title] = duration - term
else: # CASE 1
done.append(title)
small_term = next_start_at - (start_at + duration)
while small_term > 0 and wait:
t = wait.pop()
if board[t] <= small_term:
done.append(t)
small_term -= board[t]
else:
board[t] -= small_term
wait.append(t)
break
return done+wait[::-1]
교훈
- 직관적인 변수 하나가 복잡한 덧셈 뺄셈을 정리해준다
- 바로 코드부터 쓰려고 했더니, 테스트 케이스에서만 맞고 실제 채점에선 실패했다.
- 구상부터 하고, 코드 짜는 연습하자
- 구현이 아직 약하다..ㅠㅠ
참고할 풀이 (프로그래머스 다른 사람 답)
def solution(plans):
plans = sorted(map(lambda x: [x[0], int(x[1][:2]) * 60 + int(x[1][3:]), int(x[2])], plans), key=lambda x: -x[1])
lst = []
while plans:
x = plans.pop()
for i, v in enumerate(lst):
if v[0] > x[1]:
lst[i][0] += x[2]
lst.append([x[1] + x[2], x[0]])
lst.sort()
return list(map(lambda x: x[1], lst))
어케했누...
'⚡️algorithm > accepted' 카테고리의 다른 글
[투포인터, 정렬된 배열의 구간합] 프로그래머스 lv2. 연속된 부분 수열의 합 (0) | 2023.04.13 |
---|---|
[합집합, 교집합, 병합 정렬] 프로그래머스 lv2. 뉴스클러스터링 (0) | 2023.02.26 |
[프로그래머스] lv.0 옹알이(1) - 반복문 주의 (0) | 2023.02.19 |
[gcd, 최대공약수] 프로그래머스 lv 0. 유한소수 판별하기 (0) | 2023.02.12 |
[set, 집합, 기본] 프로그래머스. 외계어 사전 (0) | 2023.02.06 |