야구 경기 포인트 레코더가 있다고 가정합니다. 문자열 목록이 있습니다. 각 문자열은 다음 4가지 유형 중 하나일 수 있습니다. -
- 정수(한 라운드의 점수) - 이번 라운드에서 얻은 점수를 나타냅니다.
- "+"(한 라운드의 점수) - 이번 라운드에서 얻은 점수가 마지막 두 개의 유효한 라운드 점수의 합임을 나타냅니다.
- "D"(한 라운드의 점수) - 이번 라운드에서 얻은 점수가 마지막 유효한 라운드의 점수를 두 배로 늘린 데이터임을 나타냅니다.
- "C"(라운드 점수가 아닌 작업) - 마지막으로 얻은 유효한 라운드의 점수가 유효하지 않아 제거해야 함을 나타냅니다.
각 라운드의 작업은 영구적이며 라운드 이전과 이후에 영향을 미칠 수 있습니다. 모든 라운드에서 얻을 수 있는 점수의 합을 찾아야 합니다.
따라서 입력이 ["5","2","C","D","+"]와 같으면 출력은 30이 됩니다. 이것은 실제로
를 위한 것입니다.- 1라운드 - 5점을 얻을 수 있습니다. 합계는 5입니다.
- 2라운드 - 2점을 얻을 수 있습니다. 합계는 7입니다.
- 작업 1 - 라운드 2의 데이터가 잘못되었습니다. 합계는 5입니다.
- 3라운드 - 10점을 얻을 수 있습니다. 합계:15.
- 4라운드 − 5 + 10 =15점을 얻을 수 있습니다. 합계:30.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 스택 :=빈 목록
- 작업의 각 i에 대해 다음을 수행합니다.
- i가 "+"와 같으면
- 첫 번째 :=스택[스택 크기 - 1], 두 번째 :=스택[스택 크기 - 2]
- 마지막에 스택에 (첫 번째 + 두 번째) 삽입
- 그렇지 않으면 i가 "D"와 같을 때
- 마지막 스택에 (스택의 마지막 요소 * 2) 삽입
- 그렇지 않으면 i가 "C"와 같을 때
- 스택에서 마지막 요소 삭제
- 그렇지 않으면
- 마지막에 스택에 i 삽입
- i가 "+"와 같으면
- 스택의 모든 요소의 합계 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
class Solution: def calPoints(self, ops): stack = [] for i in ops: if i == "+": first, second = stack[len(stack) - 1], stack[len(stack) - 2] stack.append(first + second) elif i == "D": stack.append(stack[-1] * 2) elif i == "C": stack.pop() else: stack.append(int(i)) return sum(stack) ob = Solution() print(ob.calPoints(["5","2","C","D","+"]))
입력
["5","2","C","D","+"]
출력
30