https://www.acmicpc.net/problem/16637
백준 16637번 괄호 추가하기라는 문제인데, 이 문제를 풀면서 했던 뻘짓을 기록해두려고 한다.
3+8*2 이런 문자열이 있다고 할 때, 결과값을 내도록 구현하려면 어떻게 해야할까?
그냥 str[0] ~ str끝까지 한 문자 한 문자 확인하려고 생각하는 순간 굉장히 피곤해진다.
324 + 232 이런 경우처럼, 한 자리수가 아닌 숫자가 존재할 수 있기 때문이다. 처음에 이렇게 접근했다가, 결과적으로 아래와 같은 뻘짓을 하게 되었다.
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 | string calculate(int a, char opt, int b) { if (opt == '+') return to_string(a + b); else if (opt == '-') return to_string(a - b); else return to_string((ll)(a*b)); } int makeAns(string cur) { if (cur.length() == 0) return 0; int res = stoi(cur.substr(0, 1)); for (int i = 1; i < cur.length() - 1; i++) { if (cur[i] - '0' < INT_MAX && cur[i] - '0' > -1 * INT_MAX) continue; if (!(cur[i] - '0' < INT_MAX && cur[i] - '0' > -1 * INT_MAX)) { if (cur[i + 1] - '0' < INT_MAX && cur[i + 1] - '0' > -1 * INT_MAX) { res += stoi(calculate(res, cur[i], stoi(cur.substr(i + 1, 1)))); } else { i++; res += stoi(calculate(res, cur[i], -1 * stoi(cur.substr(i + 2, 1)))); } } } cout << "계산결과 : " << res << '\n'; } void process() { string str = ""; for (int i = 0; i < n; i++) { if (!picked[i]) str += cmd[i]; else { if (done[i]) continue; else { int a, b; a = stoi(cmd.substr(i, 1)); b = stoi(cmd.substr(i + 2, 1)); str += calculate(a, cmd[i + 1], b); done[i] = true; done[i + 1] = true; done[i + 2] = true; } } } cout << str << '\n'; } | cs |
위와 같은 뻘짓을 하지 않으려면, 연산자와 피연산자를 분리해서 벡터(배열)에 저장하고 있으면 된다. 연산하기가 훨씬 수월하다.
1 2 3 4 | ll res = numV[0]; for (int i = 1; i < numV.size(); i++) { res = cal(res, oprV[i - 1], numV[i]); } | cs |
이렇게 간단하게 계산할 수 있다.
정상적인 수식이라면, 연산자의 개수가 피연산자의 개수보다 하나 적을 것이므로, 깔끔하게 위와 같은 반복문을 만들어낼 수 있다.
'알고리즘 문제 풀이 > 오답' 카테고리의 다른 글
백준 2251번: 물통 (C++) (0) | 2019.08.31 |
---|---|
백준 1525번: 퍼즐 (C++) (0) | 2019.08.30 |
[오답] 카카오 2018 블라인드 테스트: 무지의 먹방 라이브 C++ (0) | 2019.08.20 |
[오답] 백준 1941 소문난 칠공주 C++ (0) | 2019.08.10 |
[오답] 백준 1799번: 비숍 (C++) (0) | 2019.07.24 |