1 minute read

176962. 과제 진행하기 / c++ / level2 / 1시간+

문제 및 코드 (링크)

image

접근 방식

스택

  1. { 과제명, 시작 시간, 필요 시간} 을 원소로 하는 배열 plans가 주어지고, 문제의 조건에 따라 과제를 수행할 때, 과제가 끝난 순서를 반환하는 문제
  2. 과제가 시작 시간으로 정렬되어 있지 않을 경우가 있으므로, 시작 시간을 기준으로 정렬
  3. 현재 과제의 시작 시간을 다음 과제와 비교해야하고, 마지막으로 시작한 과제는 항상 완료하므로 plans 를 size()-1 만큼 순회하고, 순회가 끝나면 answer에 마지막 과제명을 넣어줬다.
  4. 과제 계획이 항상 가장 최근에 멈춘 과제부터 진행하므로 스택 자료구조를 사용했다.
  5. plans를 3번처럼 순회하면서
    1. 현재 과제를 우선 Stack 에 넣음 (현재 과제가 끝나도 이전 과제를 검사하는 식으로 흐름을 이어가기 위해서)
    2. while 문으로 Stack 이 빌 때까지 반복
      1. 현재 과제가 다음 과제의 시작 시간 전에 끝나는지 체크
      2. 만약 끝나지 않는다면, 스택에 넣고 break (이 때, 어쨌든 현재 과제를 일정 시간만큼 진행했으므로 진행 경과를 현재 과제의 playtime에 갱신해줘야 한다.)
      3. 끝난다면, 현재 시간을 현재 과제가 끝나는 시간으로 갱신 후, 현재 과제명을 answer에 넣고 다음 과제로 continue
  6. answer를 반환
  7. 해결

생각해 볼 점

  1. 문제에서 못 끝낸 과제를 쌓고, 현재 과제를 끝냈을 때 가장 최근의 못 끝낸 과제부터 처리한다고 해서 (LIFO) 스택으로 접근했다.
  2. 처음엔 단순히 현재 과제의 끝내는 시간과 다음 과제의 시작 시간만 비교해서 끝내는지 못끝내는지를 체크하는 식으로 풀었는데, 45점이 나왔다.
  3. 다시 생각해보니, 현재 과제를 끝내고 시간이 남았을 경우 못 끝낸 과제를 이어서 해결해야 하는데, 그 부분을 빼먹었었다.
  4. 또, 과제를 했지만 다 끝내지 못한 경우에도 어쨌든 과제를 진행한 시간 만큼은 playtime에서 감소시켜야 했는데 이 부분도 풀다가 생각해냈다.
  5. 단순한 스택 문제라고 생각했는데, 문자열 비교가 섞여있어서 재밌었다.
  6. 이번에도 문제를 한번에 다 파악하고 진행했어야 했는데, 얼추 파악이 됐다고 생각하고 바로 코드를 작성해서 문제의 본질을 파악하는데 약간 시간이 추가되었다.

해시태그

#99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #TIL