[LeetCode] Baseball Game

아르당·2026년 2월 14일

LeetCode

목록 보기
150/213
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

Problem

특이한 규칙이 적용되는 야구 경기의 점수를 기록하고 있다. 경기 시작 시에는 빈 기록지로 시작한다.

operations이 주어지는데, operations[i]는 기록지에 적용해야 하는 i번째 연산이며 다음 중 하나이다.

  • 정수 x - x의 새로운 점수를 기록한다.
  • '+' - 이전 점수를 두 배로 하고 기록한다.
  • 'D' - 새로운 점수와 이전 점수를 뺀다.
  • 'C' - 이전 점수를 무효하고 기록에서 삭제한다.

모든 연산을 적용한 후 레코드에 있는 모든 점수의 합계를 반환해라.

Example

#1
Input: ops = ["5", "2", "C", "D", "+"]
Output: 30
Explanation:
"5" - 기록에 5를 더하고, 기록은 지금 [5]이다.
"2" - 기록에 2를 더하고, 기록은 지금 [5, 2]이다.
"C" - 이전 기록을 무효하고 삭제하고, 기록은 지금 [5]이다.
"D" - 기록에 2 * 5 = 10 더하고, 기록은 지금 [5, 10]이다.
"+" - 기록에 5 + 10 = 15 더하고, 기록은 지금 [5, 10, 15]이다.
총합은 5 + 10 + 15 = 30이다.

#2
Input: ops = ["5", "-2", "4", "C", "D", "9", "+", "+"]
Output: 27

#3
Input: ops = ["1", "C"]
Output: 0

Constraints

  • 1 <= operations.length <= 1000
  • operations[i]는 "C", "D", "+",[-3 10^4, 3 10^4] 범위에 있는 문자열로 된 정수이다.
  • "+" 연산은 기록에서 항상 최소 두 개 이상의 이전 점수가 존재한다.
  • "C", "D" 연산은 기록에서 항상 최소 하나 이상의 이전 점수가 존재한다.

Solved

class Solution {
    public int calPoints(String[] operations) {
        LinkedList<Integer> list = new LinkedList<>();
        int sum = 0;

        for(String op : operations){
            switch(op){
                case "C":
                    sum -= list.removeLast();
                    break;
                case "D":
                    int item = list.getLast();
                    list.addLast(item * 2);
                    sum += item * 2;
                    break;
                case "+":
                    int value = list.get(list.size() - 2) + list.getLast();
                    list.addLast(value);
                    sum += value;
                    break;
                default:
                    list.addLast(Integer.parseInt(op));
                    sum += Integer.parseInt(op);
                    break;
            }
        }

        return sum;
    }
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글