티스토리 뷰

반응형
프로그래머스: 과제 진행하기 (Python)

프로그래머스: 과제 진행하기 (Python)

문제

✔️ 문제 설명

루는 여러 개의 과제를 정해진 시간에 맞춰 진행하려고 합니다. 규칙은 다음과 같습니다:

  • 각 과제는 반드시 정해진 시각에 시작합니다.
  • 진행 중인 과제가 있어도 새 과제 시작 시간이 되면 즉시 멈추고 새 과제를 시작합니다.
  • 멈춘 과제는 스택(Stack)에 보관합니다.
  • 시간이 남으면, 가장 최근에 멈춘 과제부터 이어서 진행합니다.
  • 모든 과제를 끝낸 순서대로 이름을 배열로 반환합니다.

✔️ 입력 예시

plans = [
    ["art", "12:00", "50"], 
    ["math", "12:20", "30"], 
    ["english", "12:25", "40"], 
    ["science", "12:40", "20"], 
    ["history", "13:00", "30"]
]

✔️ 출력 예시

["science", "history", "english", "math", "art"]

문제 작동 원리

📌 규칙 요약

상황 행동
새 과제 시작 시간이 도착 지금 과제는 중단, 새 과제 시작
과제를 끝냈을 때 스택이 비어 있지 않음 스택에서 가장 최근 과제를 꺼내 재개
과제 종료 시각 = 새 과제 시작 시각 새 과제를 먼저 시작

아이디어

💡 1. 시간 → 분 단위로 변환

시간 문자열(예: "12:25")을 분 단위로 변환하여 비교를 간단히 합니다.

  • "12:25" → 12 * 60 + 25 = 745 (분)

💡 2. 시작 시간 기준 정렬

과제를 시작 시간 순으로 정렬하여 처리 순서를 보장합니다.

과목 시작 시각 분 단위 소요 시간
art 12:00 720 50
math 12:20 740 30
english 12:25 745 40
science 12:40 760 20
history 13:00 780 30

💡 3. 스택 사용

새 과제가 시작되면 현재 과제를 스택에 push하고, 시간이 남으면 스택에서 pop하여 최근 멈춘 과제를 재개합니다.

✅ 도식 기반 예시 (복잡한 흐름)

12:00 — art 시작

시작시간 - 720 721 722 ... 739 - 12:20
art     -------------------- (진행)

스택: [50, art]

12:20 — math 시작 (art 중단)

시작시간 - 740 741 742 743 744 - 12:25
art     -------------------- 
math              ----------- (진행)

남은 시간: 20분, art 남은 시간: 50분 → art 남은 30분 저장

스택: [30, art]

12:25 — english 시작 (math 중단)

시작시간 - 745 746 747 ... 759 - 12:40
math              ----------- 
english                 ---------------- (진행)

남은 시간: 5분, math 남은 시간: 30분 → math 남은 25분 저장

스택: [25, math], [30, art]

12:40 — science 시작 (english 중단)

시작시간 - 760 761 ... 779 - 13:00
english                 ---------------- 
science                          ---- (진행)

남은 시간: 15분, english 남은 시간: 40분 → english 남은 25분 저장

스택: [25, english], [25, math], [30, art]

13:00 — history 시작 (science 중단)

시작시간 - 780 781 782 ... 809 - 13:30
science                          ---- 
history                                --------- (진행)

남은 시간: 20분, science 남은 시간: 20분 → science 완료

스택: [25, english], [25, math], [30, art]

완료: [science]

13:30 — history 종료 → english 재개

시작시간 - 810 811 ... 834 - 13:55
english        ------------

남은 시간: 25분, english 남은 시간: 25분 → english 완료

스택: [25, math], [30, art]

완료: [science, history, english]

13:55 — math 재개

시작시간 - 835 836 ... 859 - 14:20
math     -------------

남은 시간: 25분, math 남은 시간: 25분 → math 완료

스택: [30, art]

완료: [science, history, english, math]

14:20 — art 재개

시작시간 - 860 861 ... 889 - 14:50
art     -------------------

남은 시간: 30분, art 남은 시간: 30분 → art 완료

스택: []

완료: [science, history, english, math, art]

최종 종료 순서

science → history → english → math → art

전체 코드

def solution(plans):
    answer = []
    stack = []
    plan = []
    for i in plans:
        plan.append([i[0], int(i[1].split(':')[0]) * 60 + int(i[1].split(':')[1]), int(i[2])])

    plan.sort(key=lambda x: x[1])

    stack.append([plan[0][0], plan[0][1] + plan[0][2]])

    N = len(plan)
    i = 1
    answer = []

    while i < N:
        if stack[-1][1] <= plan[i][1]:
            answer.append(stack[-1][0])
            stack.pop()
            stack.append([plan[i][0], plan[i][1] + plan[i][2]])
        else:
            stack.append([plan[i][0], plan[i][1] + plan[i][2]])
        i += 1

    while len(stack) > 0:
        answer.append(stack[-1][0])
        stack.pop()
    return answer

결론

✅ 핵심 요약

  • 시간은 분 단위로 바꾸어 계산합니다.
  • 시작 시간 기준으로 정렬합니다.
  • 새 과제가 시작되면 지금 과제는 멈추고 스택에 push합니다.
  • 시간이 남으면 스택에서 pop하여 최근 멈춘 과제를 재개합니다.
  • 최종 순서는 스택의 pop 순서와 맞물려 정해집니다.

✅ 기억할 점

  • 겹치는 경우는 항상 새 과제를 우선 시작합니다.
  • 스택은 "가장 최근 멈춘 과제부터" 재개한다는 점에서 적합합니다.
  • 복잡한 예제일수록 남은 시간과 과제 소요 시간 비교가 핵심입니다.

💬 마무리

이 문제는 단순히 구현이 아니라, "시간 흐름을 따라가며 스택에서 push/pop 하는 과정"을 상상해야 이해할 수 있습니다. 그림처럼 진행 상황과 스택 변화를 동시에 따라가면, 코드의 한 줄 한 줄이 왜 필요한지 명확히 이해할 수 있습니다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함
반응형