각 요소가 아래와 같은 작업 중 하나인 ops라는 문자열 목록이 있다고 가정합니다. -
- 스택에 푸시될 음이 아닌 정수 값
- 스택에서 최상위 요소를 삭제하는 "POP"
- 맨 위 요소를 스택에 다시 삽입하여 중복되도록 "DUP"
- "+":상위 두 요소를 표시하고 합계 값을 푸시합니다.
- "-"는 상위 두 요소를 표시하고 (상단 요소 - 상단 바로 아래 요소)의 결과를 푸시합니다.
따라서 이러한 모든 작업을 적용한 후 스택에서 최상위 mot 요소를 찾아야 합니다. 일부 작업이 유효하지 않으면 -1을 반환합니다.
따라서 입력이 ops =["5", "2", "POP", "DUP", "3", "+", "15", "-"]인 경우 출력은 7이 됩니다. 처음에 처음 두 연산을 사용하여 스택이 [5, 2]와 같도록 5와 2를 삽입한 다음 현재 스택이 [5]와 같도록 하나를 팝합니다. 그 후 DUP의 경우 5가 복제되므로 스택은 [5, 5]와 같으며 3을 추가한 다음 [5, 5, 3]을 추가한 다음 추가 작업의 경우 [5, 8]이 되고 15를 삽입하므로 [5, 8, 15] 그 후 빼기 연산의 경우 스택은 [5, (15-8)] =[5, 7]이 됩니다. 따라서 최상위 요소는 7입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 스택 :=새 스택
- 작업의 각 i에 대해 다음을 수행합니다.
- i가 숫자이면
- 나를 스택에 푸시
- 그렇지 않으면 스택의 크기>=1이고 i가 "POP"이면
- 스택에서 맨 위 요소 팝
- 그렇지 않으면 스택의 크기>=1이고 i가 "DUP"과 같으면
- 스택의 최상위 요소를 p로 팝
- p를 두 번 삽입
- 그렇지 않으면 스택의 크기>=2이고 i가 "+"와 같으면
- 스택에서 최상위 요소를 팝핑
- 스택의 최상위 요소를 b로 팝
- 스택에 (a + b) 푸시
- 그렇지 않으면 스택의 크기>=2이고 i가 "-"와 같으면
- 스택에서 최상위 요소를 팝핑
- 스택의 최상위 요소를 b로 팝
- 스택에 (a - b) 푸시
- 그렇지 않으면
- 반환 -1
- i가 숫자이면
- 스택에서 최상위 요소 반환
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
def solve(ops): stack = [] for i in ops: if i.isnumeric() == True: stack.append(int(i)) elif len(stack) >= 1 and i == "POP": stack.pop() elif len(stack) >= 1 and i == "DUP": p = stack.pop() stack.append(p) stack.append(p) elif len(stack) >= 2 and i == "+": a = stack.pop() b = stack.pop() stack.append(a + b) elif len(stack) >= 2 and i == "-": a = stack.pop() b = stack.pop() stack.append(a - b) else: return -1 return stack.pop() ops = ["5", "2", "POP", "DUP", "3", "+", "15", "-"] print(solve(ops))
입력
["5", "2", "POP", "DUP", "3", "+", "15", "-"]
출력
7