이번 문제는 과제 진행하기 문제이다.
음.. 설명을 정리하면 아래와 같다
1. 각 과제들은 시작 시간이 정해져 있다.
2. 새로운 과제를 시작할 시간이 되었다면, 기존에 진행중인 과제를 멈추고 새로운 과제를 시작한다.
3. 진행중인 과제를 끝냈을 때, 잠시 멈춘 과제가 있다면, 멈춰둔 과제를 이어서 진행하며, 만약 과제가 끝난 시간에 새로 시작해야할 과제와 멈춰둔 과제가 동시에 있다면 새로운 과제부터 시작한다.
4. 멈춰둔 과제가 여러 개일 경우, 가장 최근에 멈춘 과제부터 시작한다.
제한사항을 보면 plans 의 원소가 [이름, 시작시간, 요구시간] 으로 주어진다. 그리고 과제가 끝나는 시각과 새로운 과제를 시작해야 하는 시각이 같은 경우에는 과제가 끝난 것으로 판단해야 한다.
입출력 예 1번은 순서대로 작업이 완료된다.
입출력 예 2번은
먼저 'music'이 작업을 시작한다. 그리고 computer 가 작업이 되며 music은 대기열로 이동한다, 그 다음 science 가 작업되며, computer도 대기열로 이동한다, science 는 정상적으로 작업이 마무리 되었고(1번), 다시 computer를 작업을 시작한다.
computer 작업 도중 history 의 시작 시간이 되었기에, history 과제를 수행한다. 이제 plans 에 남은 과제가 없기 때문에 history를 2번째로 작업 완료 후 남은 과제 중 가장 최근에 중지한 computer 가 우선 작업되고 그 다음 science 가 작업된다.
입출력 예 3번은
'aaa'는 12시에 시작해서 12시 20분에 끝이 나게 된다. 하지만 12시10분에 'bbb'가 시작하므로, 'aaa'는 대기하게 된다.
'bbb'는 12시 40분에 끝이 나는데, 그 사이 시작하는 과제는 없다. 따라서 'bbb'가 answer[0] 이 된다.
이제 12시 40분에 'aaa'를 다시 시작하려 하였으나, 'ccc'가 시작하는 시간이다. 따라서 'ccc'를 먼저 진행하고, 그 다음 'aaa'를 마무리 한다.
deque 는 사용하지 않아도 무방한데, 습관적으로 이런 문제에서는 사용하게 되었다.
먼저 plans를 돌면서 작업 내용, 시작시간, 필요시간을 추려서 works 에 전달한다.
그 다음 시작시간을 기준으로 오름차순 정렬하여 주고, 이를 deque()로 선언하여 준다.
본격적으로 전체 탐색에 앞서 현재 작업물 works[0]을 기준으로 현재 시간과 대기열을 추가로 설정해 주었다.
이제 wokrs 를 while문으로 반복하며 조건에 맞춰 작업을 진행하게 된다.
next_time 은 다음 경과 시간으로, 현재 작업물의 종료 시간과 works 에 남아있는 다음 작업의 시작 시간중에 min() 값을 사용한다. 그리고 현재 작업물의 필요시간을 다음 시간만큼 감소시켜 주고, 현재 시간을 다음 시간으로 갱신한 다음 그 값을 기준으로 조건문을 돌게 된다.
만약 필요시간이 0 보다 큰 경우라면, 현재 시간은 다음 작업의 시작 시간을 의미한다. 즉 현재 작업물은 대기열(remained)로 빠지게 되면, 현재 작업물은 works[0] 이 된다.
만약 필요시간이 0 이라면, 이는 현재 작업의 완료가 됐음을 의미한다.
따라서 answer 에 현재 작업의 과제 제목을 전달하고, 다음 작업물로 연결해야 하는데
만약 현재 시간이 다음 작업의 시작시간과 동일한 경우라면, 다음 작업을 선택하면 된다.
하지만 여유 시간이 있는 경우라면 조금 복잡해 진다.
1. 대기열에 대기중이 작업이 있다면, pop() 을 이용해 가져와 다시 while문을 탐색한다.
2. 만약 대기열이 비었다면, works[0]을 가져와 작업하게 되는데, 이 때, 현재 시간을 해당 작업물의 시작 시간으로 변경해 주어야 한다. (이 코드 한줄 때문에 1시간을 넘게 고민을 했다...)
그리고 최종적으로 works 가 비게 되는 순간이 오면, 해당 작업 제목을 answer 에 넣어주고 while문은 종료된다.
만약 대기열이 있다면, 역순으로 뽑아서 answer에 추가해 주면 된다.
'프로그래머스 퀴즈(Python) > level 2' 카테고리의 다른 글
23.04.20 파이썬 코딩 퀴즈#231 두 원 사이의 정수 쌍 (프로그래머스 스쿨) (0) | 2023.04.20 |
---|---|
23.04.20 파이썬 코딩 퀴즈#230 연속된 부분 수열의 합 (프로그래머스 스쿨) (0) | 2023.04.20 |
23.04.19 파이썬 코딩 퀴즈#228 광물 캐기 (프로그래머스 스쿨) (1) | 2023.04.19 |
23.04.18 파이썬 코딩 퀴즈#227 리코쳇 로봇(프로그래머스 스쿨) (0) | 2023.04.18 |
23.04.18 파이썬 코딩 퀴즈#226 당구 연습(프로그래머스 스쿨) (0) | 2023.04.18 |