1. 문제 풀이
단순 문자열 파싱 문제였습니다. 각 문자열에 매칭이 되는 숫자정보들을 해쉬에 저장, 문자열에서 숫자들과 연산자 정보를 컨버트 해서 뽑아내는데 뽑아낼 수 없는 상황에 처하면 false를 반환했습니다. true를 반환받았다면 숫자들과 연산자 정보를 가지고 순서대로 연산한 결과를 다시 문제에서 요구하는 형태로 바꾸어 출력했습니다.
여담이지만 원래 문제를 풀이할 때, 어느 정도 분석을 한 뒤 구현할 기능들을 나누어 풀이하였는데 이 문제를 풀던 날 너무 하기가 싫어서 생각을 안 하고 작성하면서 풀었습니다. 당연하게도 전 천재가 아니라서 WA를 무더기로 받았습니다. 지금은 AC를 받았지만 좀 하기가 싫었지만 지금은 생각이란 걸 조금 해서 풀이할 수 있었습니다. 확실한 건 어떤 문제를 마주치든 분석은 필수라고 생각합니다. 만약에 제가 이런 상태가 아니었으면 좀 더 깔끔한 코드로 작성했을 것 같습니다.
2. 코드
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pi; typedef pair<ll, ll> pl;
typedef tuple<int, int, int> ti; typedef tuple<ll, ll, ll> tl; typedef vector<int> vi; typedef vector<ll> vl;
typedef vector<pi> vpi; typedef vector<pl> vpl; typedef vector<ti> vti; typedef vector<tl> vtl;
typedef vector<string> vs; typedef vector<bool> vb; typedef queue<int> qi; typedef queue<ll> ql;
typedef queue<pi> qpi; typedef queue<pl> qpl; typedef queue<ti> qti; typedef queue<tl> qtl;
#define fastio(x, y) cin.tie((x))->sync_with_stdio((y))
#define X first
#define Y second
#define pb push_back
#define sz(x) (int((x).size()))
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
const char nl = '\n';
unordered_map<string, int> s2c = {
{"ZERO", '0'}, {"ONE", '1'},
{"TWO", '2'}, {"THREE", '3'},
{"FOUR", '4'}, {"FIVE", '5'},
{"SIX", '6'}, {"SEVEN", '7'},
{"EIGHT", '8'}, {"NINE", '9'}
};
unordered_map<int, string> c2s = {
{'0', "ZERO"}, {'1', "ONE"},
{'2', "TWO"}, {'3', "THREE"},
{'4', "FOUR"}, {'5', "FIVE"},
{'6', "SIX"}, {'7', "SEVEN"},
{'8', "EIGHT"}, {'9', "NINE"}
};
ll a, b;
string str;
vector<ll> numberList;
vector<char> opList;
string left_side;
bool isoperate(char cur){ return cur == '+' || cur == '-' || cur == '*'; }
bool convert(){
string cur{}, number{};
for(int i = 0; i < sz(str); i++){
if(sz(cur) > 5) return 0;
if(isupper(str[i])){
cur.pb(str[i]);
if(s2c.find(cur) != s2c.end()){
number.pb(s2c[cur]);
left_side.pb(s2c[cur]);
cur = "";
}
continue;
}
left_side.pb(str[i]);
if(sz(cur) != 0 || isoperate(str[i-1]) || (str[i] == '=' && i != sz(str) - 1)) return 0;
opList.pb(str[i]);
try{
numberList.pb(stoll(number));
} catch(const exception e){
return 0;
}
number = "";
}
return 1;
}
string number_to_string(ll n){
string ret = (n < 0) ? "-" : "";
string tmp = to_string(abs(n));
for(auto c : tmp) ret += c2s[c];
return left_side + '\n' + ret;
}
string solve(){
ll ret = numberList[0];
for(int i = 1; i < sz(numberList); i++){
char op = opList[i-1];
if(op == '+') ret = ret + numberList[i];
else if(op == 'x') ret = ret * numberList[i];
else if(op == '-') ret = ret - numberList[i];
else if(numberList[i] == 0) return "Madness!";
else ret = ret / numberList[i];
}
return number_to_string(ret);
}
int main() {
fastio(nullptr, false);
// input
cin >> str;
// solve
string ans = "Madness!";
if(convert()) ans = solve();
// output
cout << ans;
}
3. 제출 결과
'알고리즘 > 백준' 카테고리의 다른 글
백준 17472번 다리 만들기 2[C++] (0) | 2024.10.23 |
---|---|
백준 32203번 연락[C++/Python/Java] (0) | 2024.10.20 |
백준 6503번 망가진 키보드[C++] (0) | 2024.10.18 |
백준 14369번 전화번호 수수께끼 (Small)[C++] (0) | 2024.10.17 |
백준 1414번 불우이웃돕기[C++] (0) | 2024.10.16 |