17952. 과제는 끝나지 않아!

Rin01·2023년 5월 30일
0

problem_solving

목록 보기
11/24

문제가 궁금하시다면 아래의 링크를 눌러주세요!
링크

접근 과정

주어지는 N만큼의 시간 안에서 과제를 수행하는데 수행 중 새로운 과제가 들어오면 진행중이던 과제를 보관하고, 새로운 과제를 모두 끝마치면 가장 마지막에 수행하던 과제를 다시 꺼내와서 수행한다는 점에서 이번 문제 역시 스택의 개념으로 접근해야 한다는 것을 알 수 있었다.

다행히도 과제에 우선순위가 있다거나, 과제를 수행하지 못하는 경우가 없이 단순히 들어오는 과제를 전부 수행하고, 성공하기 때문에 복잡하게 접근할 필요가 없었다.

N만큼의 시간 동안 입력으로 들어오는 문자열을 통해 해당 시간에는 과제가 없거나, 혹은 새로운 과제가 들어왔다는 것을 알 수 있다. 이렇게만 보면 과제가 있다/없다 의 2가지 경우만 분류되는 것처럼 보이지만, 사실 “현재 진행중인 과제가 있는가”에 대해서도 고려가 되어야 한다.

따라서, 특정 입력이 들어왔을 때의 상태는 총 4가지로 분류할 수가 있다.

  1. 현재 과제를 진행하지 않으면서, 입력으로 새 과제가 들어온 경우
    -> 이 경우는 새로 입력받은 과제를 바로 수행하기 시작한다.
  2. 현재 과제를 진행하지 않으면서, 입력으로 새 과제가 들어오지 않은 경우
    -> 아무 일도 일어나지 않는다.
  3. 현재 과제를 진행하면서, 입력으로 새 과제가 들어온 경우
    -> 이 경우는 진행중이던 과제를 별도의 스택에 저장하고, 새로 입력받은 과제를 수행하기 시작한다.
  4. 현재 과제를 진행하면서, 입력으로 새 과제가 들어오지 않은 경우
    -> 수행하던 과제를 계속 수행한다.

이후, 과제를 끝마친 경우 과제 점수를 누적시키고 진행중이던 과제가 있는 경우 해당 과제를 꺼내오게끔 구성하였다!

풀이


import sys

input = sys.stdin.readline
N = int(input())
unfinished_homework = []
count = 0
now_score = 0
now_time = 0

for i in range(N):
    homework = list(map(int, input().split()))
    if len(homework) == 1:
        if now_time:
            now_time -= 1
    else:
        if now_time:
            unfinished_homework.append([now_score, now_time])
        now_score, now_time = homework[1], homework[2]
        now_time -= 1

    if now_score and not now_time:
        count += now_score
        if unfinished_homework:
            now_score, now_time = unfinished_homework.pop()
        else:
            now_score, now_time = 0, 0

print(count)

통과!

개선

위에서는 현재 진행중인 과제의 점수와 잔여 시간을 now_score, now_time이라는 정수형 변수에 할당하고 잔여 과제들을 별도의 스택에 넣어 보관했지만, 생각해보니 굳이 이렇게 분리할 필요까지는 없어보였다.

모든 과제를 하나의 스택에서 관리하게 하고, 현재 진행중인 과제만 스택의 제일 마지막 요소로 보관하고 꺼내오는 식으로 구성한다면 더 짧고 이해하기 쉬운 코드가 될 것 같다.

읽어주셔서 감사합니다!

profile
즐거워요

0개의 댓글