bong-u/til

프로그래머스 - 과제 진행하기 (L2)

수정일 : 2023-07-07

내 답안

 1def solution(plans):
 2    q = []
 3    answer = []
 4    for plan in plans:
 5        h, m = map(int, plan[1].split(':'))
 6        plan[1] = h*60 + m
 7        plan[2] = int(plan[2])
 8    plans.sort(key = lambda x: x[1])
 9
10    for plan in plans:
11        if q:
12            free_time = plan[1] - q[-1][1]
13        while q:
14            q[-1][2] -= free_time
15            free_time = -1 * q[-1][2]
16
17            print (free_time, q[-1][2])
18            if free_time < 0:
19                break
20
21            if q[-1][2] <= 0:
22                answer.append(q.pop()[0])
23
24        q.append(plan)
25    while q:
26        answer.append(q.pop()[0])
27
28    return answer

다른 사람 답안

 1def solution(plans):
 2    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])
 3    q = []
 4
 5    while plans:
 6        cur = plans.pop()
 7
 8        for idx, item in enumerate(q):
 9            if item[0] > cur[1]:
10                q[idx][0] += cur[2]
11
12        q.append([cur[1]+cur[2], cur[0]])
13
14    q.sort()
15    return list(map(lambda x: x[1], q))

문제

  • 과제 정보 리스트가 주어진다. (과제 : [이름, 시작시간, 걸리는 시간])
  • 진행 중인 과제와 상관없이 과제 시작 시간이 되면 무조건 시작한다
  • 진행 중인 과제를 끝냈을때 이전에 멈춰두었던 과제를 순차적으로 진행한다
  • TC
    • input

      [[“korean”, “11:40”, “30”], [“english”, “12:10”, “20”], [“math”, “12:30”, “40”]]

    • ouput

      [“korean”, “english”, “math”]

해결방법 (다른 사람 답안 기준)

  • 과제 시간 전처리 후 시작시간 기준 내림차순으로 정렬한다
  • 가장 먼저 시작하는 과제부터 pop한다
  • 큐에 저장하는데, 비어있으면 시작시간+걸리는 시간 (끝나는 시간)을 바로 저장한다
  • 큐에 원소가 있으면 큐를 순회하면서 현재 pop한 과제보다 늦게 끝나는 과제에 진행시간을 더해준다
  • 위 반복문을 다 돌면 [끝나는 시간, 과제 이름]의 형태로 과제들이 저장되어있을 것이다
  • 끝나는 시간 기준으로 정렬해서 과제 이름만 뽑아낸다