백준 3425 - 고스택 파이썬 풀이
[문제 링크]
https://www.acmicpc.net/problem/3425
[입출력 예]
[입력]
DUP MUL NUM 2 ADD END 3 1 10 50 NUM 1 NUM 1 ADD END 2 42 43 NUM 600000000 ADD END 3 0 600000000 1 QUIT
[출력]
3 102 2502 ERROR ERROR 600000000 ERROR 600000001
[소스코드]
from sys import stdin def solution(queries, stack): #5. MAX값 정하기 MAXVAL = 10 ** 9 for query in queries: # 6. try..except로 처리. # except에는 오류를 구체화할 수 있지만 # 아무것도 안 줄 경우 모든 에러를 받아줌. # raise는 에러를 강제로 발생시키는 코드 # 연산이 다 끝났을 때 값이 1개가 아니거나 # 연산 결과 최대값을 넘어가면 에러이다. 0으로 나누는 경우도 # 최대값을 넘기는 에러에 포함이 된다. # 결과는 항상 stack[-1]을 참조하면 된다. try: if query.startswith('NUM'): stack.append(int(query.replace('NUM ', ''))) else: if query == 'POP': stack.pop() elif query == 'INV': stack.append(-stack.pop()) elif query == 'DUP': stack.append(stack[-1]) elif query == 'SWP': stack[-1], stack[-2] = stack[-2], stack[-1] elif query == 'ADD': stack.append(stack.pop() + stack.pop()) elif query == 'SUB': f, s = stack.pop(), stack.pop() stack.append(s - f) elif query == 'MUL': stack.append(stack.pop() * stack.pop()) elif query == 'DIV': f, s = stack.pop(), stack.pop() # 두 수중 한 수가 음수일 때는 음수 몫을 저장 r = abs(s) // abs(f) if (0 < f and s < 0) or (f < 0 and 0 < s): r = -r stack.append(r) elif query == 'MOD': f, s = stack.pop(), stack.pop() r = abs(s) % abs(f) if s < 0: r = -r stack.append(r) if stack and MAXVAL < abs(stack[-1]): raise except: return 'ERROR' if len(stack) != 1: return 'ERROR' return stack[0] while True: #1. queries: 입력 한 세트이다. queries = [stdin.readline().strip()] if queries[0] == 'QUIT': break while True: #2. END가 나올 때 까지 명령어를 리스트에 저장 if queries[-1] == 'END': break query = stdin.readline().strip() queries.append(query) #3. 시작값을 받고, queries와 초기스택을 넣어서 함수를 실행 for _ in range(int(stdin.readline())): val = int(stdin.readline()) print(solution(queries, [val])) #4. queries 중간 중간에 있는 공백 제거 stdin.readline().strip()
[출처]
https://www.acmicpc.net/source/28957877
'PS > BOJ' 카테고리의 다른 글
백준 6918 옥상 정원 꾸미기 c++ (0) | 2022.01.13 |
---|---|
백준 1874 스택수열 c++ (0) | 2022.01.08 |
백준 2493 탑 c++ (0) | 2022.01.08 |
백준 5397 키로거 c++ (0) | 2022.01.04 |
백준 2003 수들의 합 2 (c++) (0) | 2022.01.04 |
댓글
이 글 공유하기
다른 글
-
백준 1874 스택수열 c++
백준 1874 스택수열 c++
2022.01.08 -
백준 2493 탑 c++
백준 2493 탑 c++
2022.01.08 -
백준 5397 키로거 c++
백준 5397 키로거 c++
2022.01.04 -
백준 2003 수들의 합 2 (c++)
백준 2003 수들의 합 2 (c++)
2022.01.04
댓글을 사용할 수 없습니다.