https://school.programmers.co.kr/learn/courses/30/lessons/176962
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
프로그래머스 - 과제 진행하기 (176962번)
난이도 : Lv 2
알고리즘 : Stack (스택), Sorting (정렬)
Time Complexity : O( N * logN )
def solution(plans):
stack = []
answer = []
for i in range(len(plans)):
h, m = map(int, plans[i][1].split(':'))
plans[i][1] = h*60 + m
plans[i][2] = int(plans[i][2])
plans.sort(key=lambda x: x[1])
for i in range(len(plans)-1):
stack.append([plans[i][0], plans[i][2]])
gap = plans[i+1][1] - plans[i][1]
while stack and gap:
if stack[-1][1] <= gap:
cn, ct = stack.pop()
gap -= ct
answer.append(cn)
else:
stack[-1][1] -= gap
gap = 0
answer.append(plans[-1][0])
for i in range(len(stack)):
answer.append(stack[~i][0])
return answer
스택을 활용하는 문제이다.
1. 과제를 시작 시간 기준으로 정렬한다.
2. 현재 과제를 stack에 넣는다.
2-1. 현재 과제에서 다음 과제까지의 시간 차이 gap을 계산한다.
2-2. 현재 stack에 있는 과제들의 playtime을, 최근에 stack에 들어간 순서대로 gap 만큼 빼준다.
2-2-1. 만약 최근 과제의 남은 playtime이 gap보다 작거나 같다면,
해당 최근 과제는 완전히 풀 수 있으므로 stack에서 제거한다.
그리고 gap에서 해당 playtime 만큼 빼준다.
위 과정을 gap이 stack이 비거나, 가장 최근 과제의 playtime보다 작아질 때까지 반복한다.
2-2-2. 만약 최근 과제의 남은 playtime이 gap보다 크다면,
해당 최근 과제는 완전히 풀 수 없으므로,
playtime에서 gap만 빼주고 stack은 그대로 남겨둔다.
3. answer에 마지막 과제와 stack에 남아있는 과제들을 최근 순으로 넣어준다.
'Algorithm' 카테고리의 다른 글
추석 트래픽 (17676번) - 프로그래머스 (Programmers) (1) | 2023.06.09 |
---|---|
파티 (1238번) - 백준 (BOJ) (0) | 2023.06.08 |
도서관 (1461번) - 백준 (BOJ) (0) | 2023.06.06 |
치즈 (2638번) - 백준 (BOJ) (0) | 2023.06.05 |
ACM Craft (1005번) - 백준 (BOJ) (0) | 2023.06.05 |