티스토리 뷰

728x90

https://www.acmicpc.net/problem/21737

 

21737번: SMUPC 계산기

SMUPC를 기념하기 위해 ALGOS와 DSC Sookmyung에서는 SMUPC의 각 글자로 계산이 이루어지는 계산기를 만들었다. 가은이와 혜민이는 이 계산기와 같은 방식으로 작동하는 프로그램을 만들고자 한다. 가은

www.acmicpc.net


  • 문제 : 

SMUPC를 기념하기 위해 ALGOS와 DSC Sookmyung에서는 SMUPC의 각 글자로 계산이 이루어지는 계산기를 만들었다. 가은이와 혜민이는 이 계산기와 같은 방식으로 작동하는 프로그램을 만들고자 한다. 가은이와 혜민이는 몇 가지 계산 작업을 통해 SMUPC에 해당하는 각 기호가 아래의 표와 같이 동작함을 밝혀낼 수 있었다.

[SMUPC 계산기의 동작 방식]

알파벳  S   M   U   P   C 
  해당 수식           -                 *         /
   (정수 몫   
나눗셈)
        +         여태까지의
계산 결괏값
반환

SMUPC 계산기는 기존의 사칙연산 방식과는 다르게 앞에서부터 순서대로 계산이 이루어진다. 단, 이 계산기에서 음수를 양수로 나누는 경우는 C++14의 기준을 따른다. 이는 음수에 -1을 곱해 양수로 바꾼 뒤 몫을 취하고, 그 몫에 -1을 곱한 것과 같다. 예를 들어, 5/3=1, (−5) /3=−1 로 계산된다. 더불어 SMUPC 계산기에 입력하는 수식은 다음과 같은 규칙을 따라야 한다고 한다.

  • 수식은 0부터 9까지의 숫자와 SMUPC의 알파벳만을 포함할 수 있다.
  • 수식은 수로 시작해야 하며, 알파벳으로 끝나야 한다.
  • 수식에 음수를 입력할 수 없다.
  • 수식에 입력하는 수는 0으로 시작할 수 있다.
  • 알파벳 C로 계산 결괏값을 반환한 후에 추가적인 계산을 원한다면 알파벳 기호를 추가적으로 사용하여 입력을 이어나가야 한다.
  • 알파벳 SMUP는 서로 연속해서 입력할 수 없으며 알파벳 SMUP을 입력한 직후 다른 수의 입력 없이 알파벳 C를 바로 입력할 수 없다.

SMUPC 계산기와 같은 작업을 수행할 수 있는 프로그램을 작성하여라.

 

 

 


  • 풀이 :

구현 문제다. 주어진 명령어에 해당하는 기능들을 구현하면 된다. 이 때, 유의해야 할 점은 최대 명령어가 100만개이므로

O(n^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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import sys
input = sys.stdin.readline
 
if __name__ == "__main__":
    N = int(input())
    flag = False
    S = input().strip()
    i = 0
    c = len(S)
    tmp = ''
    while S[i].isdigit() and i < c:
        tmp += S[i]
        i+=1
    stack = [int(tmp)]
    while i<c:
        tmp = ''
        if S[i] == 'S':
            i+=1
            if i >= c:
                break
            while S[i].isdigit():
                tmp += S[i]
                i+=1
                if i >= c:
                    break
            stack.append(stack.pop()-int(tmp))
        elif S[i] == 'M':
            i+=1
            if i >= c:
                break
            while S[i].isdigit():
                tmp += S[i]
                i += 1
                if i >= c:
                    break
            stack.append(stack.pop()*int(tmp))
        elif S[i] == 'U':
            i+=1
            if i >= c:
                break
            while S[i].isdigit():
                tmp += S[i]
                i += 1
                if i >= c:
                    break
            if int(stack[-1]) < 0:
                stack.append(-(abs(stack.pop())//int(tmp)))
            else:
                stack.append(stack.pop()//int(tmp))
        elif S[i] == 'P':
            i+=1
            if i >= c:
                break
            while S[i].isdigit():
                tmp += S[i]
                i += 1
                if i >= c:
                    break
            stack.append(stack.pop()+int(tmp))
        elif S[i] == 'C':
            print(stack[-1],end = ' ')
            flag = True
            i+=1
    if not flag:
        print('NO OUTPUT')
cs
320x100
댓글
© 2022 WonSeok, All rights reserved