반응형
코딩테스트 연습 - 과제 진행하기 | 프로그래머스 스쿨 (programmers.co.kr)
<문제 풀이>
- 정렬 + 스택을 이용했다.
- 처음에는 스택의 마지막과 현재 정보랑 비교해서 하는 식으로 진행하려 했으나 잘되지 않아 시간의 흐르면서 스택의 마지막에 있는 과제를 진행하는 방식으로 바꿨다.
- 먼저, 입력 받는 값의 시간을 분으로 바꿔준다. 플레이 시간도 int 값으로 변환 후 새로 list에 저장한다. 이때 시간을 key로 하고 나머지를 value로 하는 시간 체크용 dict도 만들어 준다.
- 과제 시작 시간으로 정렬하며 현재 시간을 가장 빠른 과제 시간으로, 완료한 과제수를 체크하는 변수를 초기화 해준다.
- 체크하는 과제수가 총 과제수가 될 때까지 반복문을 진행한다.
- 과제가 존재하면 가장 먼저 해야 할 과제가 걸리시는 시간 1분 차감 후 과제가 완료되었다면 정답에 완료된 과목을 넣고 스택에서 제거하며 완료한 과제수를 카운트한다.
- 이후 현재 시간이 dict에 있는 시간이라면 새로운 과제를 시작하기 위해 스택에 현 과제 정보를 추가한다.
- 현재 시간 +1분이 흐른다.
<Code>
def solution(plans):
answer = []
plan = []
stack = []
length = len(plans)
info = dict()
for name, start, playtime in plans:
h, m, = map(int, start.split(':'))
playtime = int(playtime)
start = h*60 + m # 분으로 변환
info[start] = [name, playtime] # dict에 시간에 따른 정보 저장
plan.append([name, start, playtime])
plan.sort(key=lambda x: x[1]) # 과제 시작 시간으로 정렬
time, cnt = plan[0][1], 0 # 현재 시간, 완료한 과제 수
while cnt < length:
if stack: # 현재 하고 있는 과제가 존재하는경우
stack[-1][1] -= 1 # 가장 먼저 해야하는 과제 1분 과제 수행
if stack[-1][1] == 0: # 가장 먼저 해야하는 과제를 완료했다면 answer에 추가하고 stack에서 제거
answer.append(stack[-1][0])
stack.pop()
cnt += 1 # 완료한 과제 카운트
if time in info: # 현재 시간에 시작해야하는 과제가 존재하는 경우
stack.append(info[time]) # stack에 그 과제 추가
time += 1 # 1분씩 시간이 흐름
return answer
import java.util.*;
class Solution {
public String[] solution(String[][] plans) {
ArrayList<String> result = new ArrayList<>();
ArrayList<homeWork> homework = new ArrayList<>();
Stack<homeWork> stack = new Stack<>();
HashMap<Integer, homeWork> info = new HashMap<>();
int length = plans.length;
for (String[] plan : plans) {
String[] split = plan[1].split(":");
int playTime = Integer.parseInt(plan[2]);
int start = Integer.parseInt(split[0]) * 60 + Integer.parseInt(split[1]);
info.put(start, new homeWork(plan[0], start, playTime));
homework.add(new homeWork(plan[0], start, playTime));
}
homework.sort((s1, s2) -> s1.start != s2.start ? s1.start - s2.start : s1.playTime - s2.playTime);
int time = homework.get(0).start;
int cnt = 0;
while (cnt < length) {
if (!stack.isEmpty()) {
stack.peek().playTime -= 1;
if (stack.peek().playTime == 0) {
result.add(stack.peek().name);
stack.pop();
cnt++;
}
}
if (info.containsKey(time)) {
stack.add(info.get(time));
}
time++;
}
String[] answer = result.toArray(new String[result.size()]);
return answer;
}
static class homeWork {
String name;
int start;
int playTime;
public homeWork(String name, int start, int playTime) {
this.name = name;
this.start = start;
this.playTime = playTime;
}
}
}
※ 잘못된 점, 개선점 등이 있다면 언제든 댓글로 알려주시면 감사하겠습니다.
반응형
'Alogorithm > programmers' 카테고리의 다른 글
[programmers] Lv3 표 병합 - Python (0) | 2023.03.31 |
---|---|
[programmers] Lv2 게임 맵 최단거리 - Python (0) | 2023.03.31 |
[programmers] Lv2 시소 짝꿍 - Python (0) | 2023.03.30 |
[programmers] Lv2 택배 배달과 수거하기 - Python (0) | 2023.03.29 |
[programmers] Lv2 이모티콘 할인행사 - Python (0) | 2023.03.29 |