코테 준비

[프로그래머스] 과제 진행하기 (python)

박수련 2024. 4. 12. 10:36

문제 

https://school.programmers.co.kr/learn/courses/30/lessons/176962

 

1. 과제 별로 주어진 시작 시간에 무조건 과제를 시작한다.

2. 새로운 과제를 시작할 시각이 되었을 때, 진행중인 과제를 멈추고 새로운 과제를 시작한다. 

3. 과제를 끝내고 다음 과제를 하기 전까지 시간이 남는다면 가장 최근에 멈춘 과제를 시작한다. 

4. 과제를 끝낸 순서대로 과제의 이름을 배열에 반환하는 문제. 

 

풀이 

이전 과제의 끝 시간과 새로운 과제의 시작 시간을 비교했다. 

두 과제의 시간이 겹친다면 큐에 진행중인 과제의 이름과 남은 시간을 넣어주고, 

두 과제 간 시간이 겹치지 않는다면 answer에 끝낸 과제의 이름을 넣어주었다. 

두 과제 간 빈 시간이 있다면 가장 최근에 멈춘 과제부터 진행시켜주었다. 

 

코드 

def solution(plans):
    answer = []
    
    for i in range(len(plans)):
        h,m=map(int,plans[i][1].split(":"))
        plans[i][1]=h*60+m
        plans[i][2]=plans[i][1]+int(plans[i][2])
    
    plans.sort(key=lambda x:x[1])
    
    
    queue=[]
    for i in range(len(plans)-1):
        if plans[i][2] > plans[i+1][1]:
            queue.append([plans[i][0],plans[i][2]-plans[i+1][1]])
            
        elif plans[i][2] == plans[i+1][1]:
            answer.append(plans[i][0])
        
        else:
            answer.append(plans[i][0])
            
            # 빈 시간에 queue에 남아있는 과목 공부 
            remain = plans[i+1][1]-plans[i][2]
            while remain>0 and len(queue)>0:
                if queue[-1][1]<=remain:
                    remain-=queue[-1][1]
                    answer.append(queue[-1][0])
                    queue.pop(-1)
                else:
                    queue[-1][1]-=remain
                    remain=0
        
    answer.append(plans[-1][0])
    for i in range(len(queue)-1,-1,-1):
        answer.append(queue[i][0])
        
    return answer

 

다른 풀이

 

https://school.programmers.co.kr/learn/courses/30/lessons/176962/solution_groups?language=python3

 

lst에 새로운 과제가 끝나는 시간과 이름을 저장해준다.

lst에 저장된 과제의 끝나는 시간새로운 과제의 시작 시간보다 늦은 시간이라면, lst의 끝나는 시간에 새로운 과제의 소요시간을 더해 끝나는 시간을 누적해주었다. 

이렇게 되면 최종적으로 lst에는 실제로 과제가 끝나는 시간이 저장된다. 

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))

 

 

회고

배열 안의 값을 변수가 아닌 인덱스로 표현하다 보니 가독성이 좋지 않아서 조금 더 효율적인 풀이 방법을 생각해보려고 했지만 쉽지 않았다. 그리고 처음 문제를 접근할 때 멈춰둔 과제를 오래된 과제부터 처리하는 방향으로 생각해서 푸는데 오래걸렸다.