이 영역을 누르면 첫 페이지로 이동
자라자 블로그의 첫 페이지로 이동

자라자

페이지 맨 위로 올라가기

자라자

개발자를 준비하는 자라자의 블로그입니다.

백준 3425 - 고스택 파이썬 풀이

  • 2021.12.08 17:45
  • PS/BOJ

프로그래머스로고

[문제 링크]

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

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 백준 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
다른 글 더 둘러보기

정보

자라자 블로그의 첫 페이지로 이동

자라자

  • 자라자의 첫 페이지로 이동

검색

메뉴

  • 🏠 HOME
  • 💡 ABOUT
  • 💻 GITHUB

카테고리

  • 분류 전체보기 (91)
    • Tech Note (3)
    • Dev Log (11)
    • Study Log (11)
    • Settings (3)
    • PS (53)
      • Programmers (21)
      • BOJ (32)
    • Diary (10)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 리액트
  • ㅣ
  • 공식문서읽기

나의 외부 링크

정보

자라자의 자라자

자라자

자라자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 자라자. Designed by Fraccino.

티스토리툴바