티스토리 뷰
728x90
https://www.acmicpc.net/problem/21737
- 문제 :
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까지의 숫자와 S, M, U, P, C의 알파벳만을 포함할 수 있다.
- 수식은 수로 시작해야 하며, 알파벳으로 끝나야 한다.
- 수식에 음수를 입력할 수 없다.
- 수식에 입력하는 수는 0으로 시작할 수 있다.
- 알파벳 C로 계산 결괏값을 반환한 후에 추가적인 계산을 원한다면 알파벳 기호를 추가적으로 사용하여 입력을 이어나가야 한다.
- 알파벳 S, M, U, P는 서로 연속해서 입력할 수 없으며 알파벳 S, M, U, P을 입력한 직후 다른 수의 입력 없이 알파벳 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
'Algorithm > Implementation' 카테고리의 다른 글
(Python) - BOJ(1417번) : 국회의원 선거 (0) | 2022.02.24 |
---|---|
(Python) - BOJ(1063번) : 킹 (0) | 2022.02.20 |
(Python) - BOJ(20937번) : 떡국 (0) | 2022.02.16 |
(Python) - BOJ(20044번) : Project Teams (0) | 2022.02.16 |
(Python) - BOJ(19939번) : 박 터뜨리기 (0) | 2022.02.16 |
댓글
© 2022 WonSeok, All rights reserved