2022. 1. 11. 01:47ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/1935
1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
접근 방법 - 전형적인 스택 응용문제
백준 1935번 문제는 스택의 대표 유형이라 할 수 있는 후위 표기식 문제이다.
필자는 후위식에 있어 변수에 해당하는 문자를 만나면 스택에 푸시하고
연산자를 만나면 스택에 저장되어있는 변수를 꺼내어 연산하는 식으로 코드를 구성하였다.
숫자는 별개의 배열에 저장해둔 뒤, 변수를 대신해 스택에 푸시하도록 하였다.
추가로, 예제들의 정답들이 모두 소수점 2번째 자리까지만 출력이 되어있어 이에 관한 코드도 함께 작성하였다.
필자는 아래의 순서대로 코드를 작성하며 문제를 해결하였다.
코드의 실행 순서
1) 결과 출력 시 소수점 두 번째 자리까지만 출력되게끔, 별도의 cout 설정을 한다.
2) 숫자 저장하는 스택 선언한 뒤, 테스트 케이스, 후위식, 변수의 숫자 입력받기
3) 반복문 통해서 입력받은 후위식 탐색
알파벳 변수 만났을 경우, 각 알파벳 변수에 알맞은 숫자가 저장된 배열 값을 불러와 스택에 푸시
연산자 만났을 경우, 스택의 가장 상단에 있는 2개의 숫자를 꺼내어 해당 연산을 수행한 뒤 이 결괏값을 스택에 푸시
4) 연산이 완료되면 스택에 남아있는 최종 결괏값을 출력한 뒤 실행 종료한다.
성공한 코드
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <stack>
#include <string>
using namespace std;
//백준 1935번 코드
int main() {
cout << fixed;
cout.precision(2);
stack<double> s;
int n; string ch; int num[26];
cin >> n;
cin >> ch;
for (int i = 0; i < n; i++) {
cin >> num[i];
}
for (int i = 0; i < ch.length(); i++) {
if (ch[i] == '+' || ch[i] == '-' || ch[i] == '*' || ch[i] == '/') {
double a = s.top(); s.pop();
double b = s.top(); s.pop();
double result;
switch (ch[i]) {
case '+': result = a + b; break;
case '-': result = b - a; break;
case '*': result = a * b; break;
case '/': result = b / a; break;
}
s.push(result);
}
else {
s.push(num[ch[i]-'A']);
}
}
cout << s.top() << endl;
}
제출 결과
(2022.01.01 백준 1935번 제출 결과)
(신년을 실버 문제로 시작하다니, 기특하다...!)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
[백준 BOJ] 2028번 자기복제수 (C언어) (0) | 2022.01.13 |
---|---|
[백준 BOJ] 1978번 소수 찾기 (C언어) (0) | 2022.01.11 |
[백준 BOJ] 1934번 최소공배수 (C언어) (0) | 2022.01.10 |
[백준 BOJ] 1924번 2007년 (C언어) (0) | 2022.01.09 |
[백준 BOJ] 1919번 애너그램 만들기 (C언어) (0) | 2022.01.09 |