본문 바로가기
개발/문제풀이

프로그래머스 '과제 진행하기' 파이썬 풀이

by beomcoder 2023. 9. 14.
728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/176962
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

def solution(plans):
    plans = [[n, int(s.split(':')[0])*60 + int(s.split(':')[1]),int(p)] for n, s, p in plans]
    plans = sorted(plans, key=lambda x:-x[1])
    stack, answer = [plans.pop()], []
    time = stack[-1][1]
    
    while plans:
        if stack:
            stack[-1][2] -= 1
            if stack[-1][2] == 0:
                answer.append(stack.pop()[0])
                
        if plans[-1][1] == time:
            stack.append(plans.pop())
            
        time += 1
    
    while stack:
        answer.append(stack.pop()[0])
                   
    return answer

"""
00:00 ~ 23:59까지의 시간만 있는다고 했으니 
while문이 1440번 정도 돌겠다고 생각해서 시간순으로 while문을 돌렸다.

먼저 plans의 형태가 ["korean", "11:40", "30"] 로 되어 있으니,
시간을 hh*60 + mm 으로 바꾸고, string을 int로 바꿔주는 작업을 했다.

그다음 시간순서에 맞춰서 sort해주고, stack에 첫일정을 넣어주었다.
초기 시간도 첫일정의 시간으로 맞추었다.

while문으로 들어가서 stack에서 시간을 1 감소시켜준다.
여기서 while문은 1초에 한번씩 돌기 때문이다.
["korean", "11:40", 30] -> ["korean", 700, 30]으로 바뀌고
이게 stack에 들어갔다고 가정하면 [korean, 700, 29]로 바뀐다.
0이 된다면 그 일정을 다한것이므로 answer에 이름만 넣는다.

그리고 plans에서 가장빠른 일정이 time과 같다면 stack에 넣어준다.
이를 반복한다.

그리고 plans가 빈 배열이 된다면 이제 남은 일정만 하면 되기때문에
stack에서 하나씩 꺼내어 answer에 넣어준다.
"""
728x90
반응형

댓글