📝 PS/프로그래머스 (Python)
[프로그래머스] 과제 진행하기 (파이썬, Python)
Safetymo
2023. 4. 13. 22:49
문제 : https://school.programmers.co.kr/learn/courses/30/lessons/176962#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 첫번째 풀이(통과)
from collections import deque
def solution(plans):
answer = []
for i in range(len(plans)):
h, m = map(int, plans[i][1].split(':'))
plans[i][1] = 60*h + m
plans[i][2] = int(plans[i][2])
plans.sort(key = lambda x:x[1])
count = 0
q = deque()
while(len(answer) != len(plans)):
if(count == len(plans)-1): #마지막까지 다 돌리고나면 남은 것 추가
answer.append(plans[count][0])
while q:
answer.append(q.popleft()[0])
continue
# 만약 시간이 맞거나 남으면
rest = plans[count+1][1] - plans[count][1]
if(rest >= plans[count][2]): #남은시간이 공부시간 보다 같거나, 클 경우
answer.append(plans[count][0])
rest -= plans[count][2]
if len(q) == 0:
count += 1
continue
while rest > 0 and len(q) > 0:
if q[0][1] <= rest:
a, b = q.popleft()
answer.append(a)
rest -= b
else:
q[0][1] -= rest
rest = 0
count += 1
# 만약 시간이 부족하면
else:
q.appendleft([plans[count][0], plans[count][2]-rest])
count += 1
return answer
풀이 과정은 큐를 사용해서 풀게 되었다.
문제 조건 중에 가장 최근에 멈춘 과제를 시작한다는 걸 반대로 생각해서 큐를 사용함...
그래서 추가할 때 appandleft를 사용함.
문제를 푸는데 너무 오래걸림...
가장 마지막 시간을 안넣어줘도 되는데 구현하려다 많이 소비함
스텍으로도 충분히 구현이 가능할 것 같다.
마지막걸 빼고 남으면 다시 넣어주는 식으로 하면 될듯