99클럽 코테 스터디 3기 7일차 TIL - 176962 과제 진행하기
176962. 과제 진행하기 / c++ / level2 / 1시간+
문제 및 코드 (링크)
접근 방식
스택
- { 과제명, 시작 시간, 필요 시간} 을 원소로 하는 배열 plans가 주어지고, 문제의 조건에 따라 과제를 수행할 때, 과제가 끝난 순서를 반환하는 문제
- 과제가 시작 시간으로 정렬되어 있지 않을 경우가 있으므로, 시작 시간을 기준으로 정렬
- 현재 과제의 시작 시간을 다음 과제와 비교해야하고, 마지막으로 시작한 과제는 항상 완료하므로 plans 를 size()-1 만큼 순회하고, 순회가 끝나면 answer에 마지막 과제명을 넣어줬다.
- 과제 계획이 항상 가장 최근에 멈춘 과제부터 진행하므로 스택 자료구조를 사용했다.
- plans를 3번처럼 순회하면서
- 현재 과제를 우선 Stack 에 넣음 (현재 과제가 끝나도 이전 과제를 검사하는 식으로 흐름을 이어가기 위해서)
- while 문으로 Stack 이 빌 때까지 반복
- 현재 과제가 다음 과제의 시작 시간 전에 끝나는지 체크
- 만약 끝나지 않는다면, 스택에 넣고 break (이 때, 어쨌든 현재 과제를 일정 시간만큼 진행했으므로 진행 경과를 현재 과제의 playtime에 갱신해줘야 한다.)
- 끝난다면, 현재 시간을 현재 과제가 끝나는 시간으로 갱신 후, 현재 과제명을 answer에 넣고 다음 과제로 continue
- answer를 반환
- 해결
생각해 볼 점
- 문제에서 못 끝낸 과제를 쌓고, 현재 과제를 끝냈을 때 가장 최근의 못 끝낸 과제부터 처리한다고 해서 (LIFO) 스택으로 접근했다.
- 처음엔 단순히 현재 과제의 끝내는 시간과 다음 과제의 시작 시간만 비교해서 끝내는지 못끝내는지를 체크하는 식으로 풀었는데, 45점이 나왔다.
- 다시 생각해보니, 현재 과제를 끝내고 시간이 남았을 경우 못 끝낸 과제를 이어서 해결해야 하는데, 그 부분을 빼먹었었다.
- 또, 과제를 했지만 다 끝내지 못한 경우에도 어쨌든 과제를 진행한 시간 만큼은 playtime에서 감소시켜야 했는데 이 부분도 풀다가 생각해냈다.
- 단순한 스택 문제라고 생각했는데, 문자열 비교가 섞여있어서 재밌었다.
- 이번에도 문제를 한번에 다 파악하고 진행했어야 했는데, 얼추 파악이 됐다고 생각하고 바로 코드를 작성해서 문제의 본질을 파악하는데 약간 시간이 추가되었다.
해시태그
#99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #TIL