https://www.acmicpc.net/problem/1935
[나의 문제 분석]
제일 먼저 생각한것은 stack구조였다. 알파벳이 하나씩 나오다가 연산자를 맞닥뜨리면 그때 연산자와 맨 마지막에 들어간 알파벳 2개를 서로 연산해주면 된다고 생각했다. 로직은 간단했는데 내가 부족한 스킬이 몇개가 있었다. 첫번째는 알파벳을 입력받은 배열의 숫자로 어떻게 바꾸어주냐에 관련한 것이였고, 두번째는 정답을 출력할때 소수 2번째까지 출력해주어야하는데 기억이 안나서 살짝 헤매었다.
1. 알파벳 입력을 숫자로 바꾸어주는것은 일반 nums라는 배열에 0을 저장해두고 알파벳을 확인할때 해당 nums의 index에 맞는 숫자를 출력해주면 된다.
if a.isupper():
s.append(nums[ord(a)-ord('A')])
이 코드처럼 a가 대문자임을 if문으로 확인하고, nums배열에서 A가 0번째, B가 1번째,... 이런식으로 가니까 만약 A라면 ord(a) - ord('A')는 0이되므로 nums의 첫번째에 해당하는 것이 나오게 된다. B,C,D도 마찬가지이다.
2. 소수 2번째까지 출력해주는 방법은 파이썬에서 여러가지가 있다.
- 내가 사용한것은 format 서식 지정으로 소수점을 관리하였다.
print("{:.nf}".format(number)) 로 number의 소수점 n+1번째 자릿수에서 반올림해서 소수점 n번째 자릿수까지 출력함으로써 소수점을 관리할 수 있다.
- f-string에서 소수점 관리
: print(f"{number:.nf}")로 number의 소수점 n+1번째 자릿수에서 반올림해서 소수점 n번째 자릿수까지 출력한다.
- %.?f
print('%.nf' %number)로 number의 소수점 n+1번째 자릿수에서 반올림해서 소수점 n번째 자릿수까지 출력한다.
[나의 해결 방안]
n = int(input())
sen = input()
s=[]
nums=[0]*n
for i in range(n):
nums[i]=int(input())
for a in sen:
if a.isupper():
s.append(nums[ord(a)-ord('A')])
elif a=='+':
one = s.pop()
two = s.pop()
s.append(two+one)
elif a=='-':
one = s.pop()
two = s.pop()
s.append(two-one)
elif a=='*':
one = s.pop()
two = s.pop()
s.append(two*one)
elif a=='/':
one = s.pop()
two = s.pop()
s.append(two/one)
print("{:.2f}".format(s[0]))
[다른 사람 풀이]
조금 어지럽게 푼 느낌이 있어서 다른 사람들 풀이도 찾아보았다.
기본적인 로직은 비슷하였고 대문자임을 판단하는 방식을
if 'A' <= i <= 'Z': 로 하였다. 나머지는 비슷한것 같다.
'알고리즘 > 알고리즘 문제' 카테고리의 다른 글
[파이썬] [2346 - 풍선 터트리기] (0) | 2022.01.08 |
---|---|
[파이썬] [10799 쇠막대기] (0) | 2022.01.05 |
1158 백준 요세푸스 문제 (파이썬) (0) | 2022.01.02 |
[파이썬] [프로그래머스 괄호 변환 60058] [kakao blind recruitment] (0) | 2021.08.27 |
[파이썬] [백준 18405 경쟁적 전염] (0) | 2021.08.26 |