티스토리 뷰
프로그래머스: 과제 진행하기 (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 하는 과정"을 상상해야 이해할 수 있습니다. 그림처럼 진행 상황과 스택 변화를 동시에 따라가면, 코드의 한 줄 한 줄이 왜 필요한지 명확히 이해할 수 있습니다.
'백준 스터디 > 프로그래머스' 카테고리의 다른 글
프로그래머스 광물 캐기 Python (0) | 2025.09.09 |
---|---|
프로그래머스 슬라이딩 로봇 Python (0) | 2025.09.09 |
프로그래머스 혼자서 하는 틱택토 Python (0) | 2025.09.07 |
프로그래머스 호텔 대실 155651 Python (0) | 2025.09.06 |
- Total
- Today
- Yesterday
- 객체지향
- 브루트포스
- 백준
- 알고리즘기초
- C++ 알고리즘
- C++
- 동적 계획법
- 알고리즘
- 문제풀이
- 그리디
- 인접 행렬
- 코딩
- 코딩테스트
- 그리디알고리즘
- 코딩 테스트
- c++알고리즘
- c언어
- python 알고리즘
- DP
- Python
- 그래프 탐색
- dfs
- 파이썬
- 알고리즘 문제풀이
- 문자열처리
- 파이썬코딩
- 프로그래밍
- 알고리즘문제풀이
- 문제 풀이
- 동적계획법
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |