본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 17952 : 과제는 끝나지 않아!

by 개발하는 곰돌이 2023. 1. 5.

문제 링크

 

17952번: 과제는 끝나지 않아!

성애는 이번 학기에 전공을 정말 많이 듣는다. 이로 인해 거의 매일을 과제를 하면서 보내고 있다. 그런데도 과제가 줄어들 기미가 보이지 않는데, 바로 분단위로 과제가 추가되고 있기 때문이

www.acmicpc.net



문제 해설

문제의 규칙 1, 2번에 의해 스택을 사용하면 된다는 것을 알 수 있다. 과제의 점수와 남은 시간을 나타내는 객체를 담는 스택을 선언한 후 입력에 따라 스택에서 연산을 진행한다.

  • 0이 입력되어 과제가 주어지지 않았다면 스택의 가장 윗부분 과제의 남은 시간을 1 줄인다.
  • 1이 입력되어 과제가 주어졌다면 스택에 새로운 과제를 추가한다. 이 때, 과제를 받자마자 바로 시작하기 때문에 과제의 남은 시간에서 1을 뺀 값을 추가해야 한다.

각 연산을 수행할 때마다 스택 가장 윗부분 과제의 남은 시간이 0인지 체크하여 과제가 끝났다면 스택에서 과제를 제거하고 점수를 해당 과제의 점수만큼 증가시킨다.

 

주의할 점은 과제가 항상 주어진다는 조건이 없기 때문에 스택의 가장 윗부분을 체크할 때 스택이 비어있지 않은지도 함께 확인해야 한다.


Code

import java.util.Stack
import java.util.StringTokenizer

fun main() = with(System.`in`.bufferedReader()) {
    val stack = Stack<Project>()
    var score = 0
    repeat(readLine().toInt()) {
        StringTokenizer(readLine()).apply {
            when (nextToken()) {
                "0" -> if (stack.isNotEmpty()) stack.peek().time--
                "1" -> stack.push(Project(nextToken().toInt(), nextToken().toInt() - 1))
            }
        }
        if (stack.isNotEmpty() && stack.peek().time == 0) {
            score += stack.pop().score
        }
    }
    println(score)
}

class Project(val score: Int, var time: Int)

댓글