1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
나의 코드 - 새로운 데이터를 빈 리스트로 받기(성공)
N = int(input())
data = input()
items = [int(input()) for _ in range(N)]
#영문자와 일치되는 숫자로 새로운 후위표기식 만들기
alphabet_list = []
for i in data:
if i not in '*/+-' and i not in alphabet_list: #연산자가 아닐 때, 중복되지 않은 알파벳만 넣음
alphabet_list.append(i)
alphabet_dict = {}
for i in range(len(alphabet_list)):
alphabet_dict[alphabet_list[i]] = items[i]
# print(alphabet_dict)
new_data = []
for i in data:
if i in '*/+-':
new_data.append(i)
else:
new_data.append(str(alphabet_dict[i]))
#후위표기식을 계산하기
stack = []
for i in new_data:
if i in '*/+-':
if len(stack) <= 1:
break
else:
x = float(stack.pop())
y = float(stack.pop())
if i == '*':
result = y * x
stack.append(result)
elif i == '/':
result = y / x
stack.append(result)
elif i == '+':
result = y + x
stack.append(result)
elif i == '-':
result = y - x
stack.append(result)
else:
stack.append(i)
ans = stack.pop()
print(f'{ans:.2f}')

나의 코드 - 새로운 데이터를 문자열로 추가하는 방식으로 받기(틀렸습니다)
N = int(input())
data = input()
items = [int(input()) for _ in range(N)]
#영문자와 일치되는 숫자로 새로운 후위표기식 만들기
alphabet_list = []
for i in data:
if i not in '*/+-' and i not in alphabet_list: #연산자가 아닐 때, 중복되지 않은 알파벳만 넣음
alphabet_list.append(i)
alphabet_dict = {}
for i in range(len(alphabet_list)):
alphabet_dict[alphabet_list[i]] = items[i]
# print(alphabet_dict)
new_data = ''
for i in data:
if i in '*/+-':
new_data += i
else:
new_data += str(alphabet_dict[i])
#후위표기식을 계산하기
stack = []
for i in new_data:
if i in '*/+-':
if len(stack) <= 1:
break
else:
x = float(stack.pop())
y = float(stack.pop())
if i == '*':
result = y * x
stack.append(result)
elif i == '/':
result = y / x
stack.append(result)
elif i == '+':
result = y + x
stack.append(result)
elif i == '-':
result = y - x
stack.append(result)
else:
stack.append(i)
ans = stack.pop()
print(f'{ans:.2f}')
# print(f'{stack.pop():.2f}') #소수 둘째자리까지 표시


결과

처음에는 영문자와 일치되는 숫자를 찾으려고 스택과 items리스트의 인덱스를 일치시키면서 수식을 완성해보려고 했다. 구현이 너무나도 어려웠다. 지금까지 스택문제 top을 이용해서 풀었어서 될 줄 알았다. 그리고 가원이의 블로그를 보며 영문자와 숫자를 일치시켜보고 영문자를 숫자로 변환해보자는 아이디어를 얻었다. 그래서 새로운 데이터를 얻었고 더 쉽게 후위표기식을 계산할 수 있었다. 난 알고리즘을 너무 어렵게 짜려고 하는 경향이 있는 것 같다. 다른 방법으로도 해보려는 생각과 시도가 확실히 필요할 것 같다.
딕셔너리가 잘 만들어졌는지 확인하려고 쓴 print문을 주석처리를 안해서 초반에 엄청 틀렸다. 처음부터 결과는 맞았었는데 뭐가 문제인지 모르겠다. 결과는 틀렸다고 나오지만 출력은 잘 나왔다는 걸 증명하려고 캡쳐해서 올린다. 또 다시 틀렸습니다와 출력내용을 같이 올리는 일이 없었으면 좋겠다....ㅜㅜ
+영문자를 숫자로 변환해서 새로운 데이터를 만드는 방식에서 문자열로 받았다. 그래서 계산할 때 새로운 데이터를 돌아볼 때 한글자씩만 보기 때문에 입력숫자가 10이라면 '1'과 '0'으로 받아져서 스택에 들어갔다. 그 문제를 해결하기 위해 문자열로 받지 않고 new_data를 빈 리스트에 받아서 해결할 수 있었다.
'스터디 1일 1커밋' 카테고리의 다른 글
| 240218 [BOJ/백준] 1966. 프린터 큐 (0) | 2024.02.18 |
|---|---|
| 240217 [BOJ/백준] 10828. 스택 (1) | 2024.02.17 |
| 240213 [BOJ/백준] 15649. N과 M(1) (1) | 2024.02.14 |
| 240212 [BOJ/백준] 2606. 바이러스 (+수정) (1) | 2024.02.13 |
| 240211 [BOJ/백준] 11727. 2 x n 타일링 2 (0) | 2024.02.12 |