티스토리 뷰

반응형

 문제

 

후위 표기법을 이용한 연산은 다음과 같은 규칙을 가지고 있다.

1. 숫자는 스택에 넣는다.

2. 연산자를 만나면 스택의 숫자 두 개를 꺼내 더하고 결과를 다시 스택에 넣는다.

3. ‘.’은 스택에서 숫자를 꺼내 출력한다.

연산이 불가능할 경우 'error'를 출력한다.

 

 

 

 문제 상황

 

- 형식이 잘못된 경우를 정의해야한다. 연산자를 만났을 때 꺼낼 숫자가 2개 미만이면 연산이 불가능하다.

 

 

 

 해결 전략

 

- 문제의 조건을 그대로 시뮬레이션 하면 된다.

 

 

 

 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# testcase 입력
= int(input())
# testcase를 반복하며 입력 받기
for idx in range(T):
    # 빈 스택을 생성
    stack = []
    # 연산할 연산을 입력받아 리스트로 만들기
    testcase = list(input().split())
    # testcase를 순회하며 연산하기 
    for i in range(len(testcase)):
        if testcase[i].isdecimal() :
            # 성공하면 testcase는 숫자이다.
            num =  int(testcase[i])
            stack.append(num)
        # testcase가 연산자라면
        else:
            # .이 나왔을 때 스택에 요소가 있다면 요소를 출력한다.
            if testcase[i] == '.' :
                if len(stack) == 1:
                    print(f"#{idx+1} {stack[-1]}")
                else :
                    print(f"#{idx+1} error")
                break
            # 스택에 숫자 2개 이하가 존재하면 에러
            elif len(stack) < 2:
                print(f"#{idx+1} error")
                break
            # 연산자가 나오면 연산결과를 다시 stack에 넣는다.
            stack1 = stack.pop()
            stack2 = stack.pop()
            if testcase[i] == "+":
                stack.append(stack2 + stack1)
            elif testcase[i] == "-":
                stack.append(stack2 - stack1)
            elif testcase[i] == "*":
                stack.append(stack2 * stack1)
            elif testcase[i] == "/":
                stack.append(stack2 // stack1)
cs

 

 

 해설

 

- 문제가 굉장히 부정확하게 설명되어있다. '.'이 나오는 시점에 스택에 반드시 숫자 한개가 남아야한다는 조건이 문제에 명시되어있지 않아 문제 해결에 어려움을 겪엇다. 

 

 새로 학습한 것 & 실수 

 

- 연산자를 dict형태로 처리해 {"+":+} 처럼 하려고 했으나 연산자는 데이터 타입에 포함이 안되어 dict의 annotation이 불가능하다.

 

- try구문은 except가 없으면 실행되지 않는다.

 

- try구문 안에 있다하더라도 int('.')에서 에러메세지를 발생시킨다. 숫자 여부 판단은 try가 아니라 내장함수로 진행하자.

 

- 숫자 판별 함수

  1. isdigit() : 3² 처럼 사람이 읽었을 때 숫자인가를 판별. isdigit을 통해 판별하면 int에 넣었을 때 문제 발생 가능

 

  2. isnumeric() : 숫자 모양으로 생겼는지 판별. ½ 처럼 특수문자가 들어가도 숫자로 판별해준다.

 

  3. isdecimal() : 어떤 값이 int값으로 변환이 되는가를 판단해주는 함수

    ex) testcase[i].isdecimal() 처럼 뒤에 붙여 사용

 

 

출처 - https://swexpertacademy.com/main/
반응형
댓글