📝 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를 사용함.

 

문제를 푸는데 너무 오래걸림...

가장 마지막 시간을 안넣어줘도 되는데 구현하려다 많이 소비함

스텍으로도 충분히 구현이 가능할 것 같다.

마지막걸 빼고 남으면 다시 넣어주는 식으로 하면 될듯