λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/BOJ

[BOJ] ν›„μœ„ ν‘œκΈ°μ‹(1918)

[λ°±μ€€(BOJ)] ν›„μœ„ ν‘œκΈ°μ‹(1918) C++

문제 : BOJ_1918번 ν›„μœ„ ν‘œκΈ°μ‹

문제 μ„€λͺ…

Stack

μ€‘μœ„ ν‘œκΈ°μ‹μœΌλ‘œ μ˜ˆμ œκ°€ μ£Όμ–΄μ§€λ©΄ 이것을 ν›„μœ„ ν‘œκΈ°μ‹μœΌλ‘œ λ°”κΎΈλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

ν”Όμ—°μ‚°μžλŠ” μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ§Œ λ‚˜μ˜€λ©°, '-'κ°€ κ°€μž₯ μ•žμ— λ‚˜μ˜€κ±°λ‚˜, '*'κ°€ μƒλž΅λ˜λŠ” μž…λ ₯은 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

stack을 상황에 맞게 ν™œμš©ν•΄μ„œ ν’€μ–΄μ•Ό ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.


Solution

전체 λ¬Έμžμ—΄μ„ μž…λ ₯λ°›κ³  μ•„λž˜μ™€ 같은 κ·œμΉ™μœΌλ‘œ μˆœνšŒν•©λ‹ˆλ‹€.

  • ν”Όμ—°μ‚¬μžλŠ” 무쑰건 화면에 좜λ ₯ν•œλ‹€.
  • '('κ°€ λ‚˜μ˜€λ©΄ stack에 push ν•œλ‹€.
  • ')'κ°€ λ‚˜μ˜€λ©΄ '('κ°€ λ‚˜μ˜¬ λ•ŒκΉŒμ§€ stack을 λΉ„μš°λ©° 좜λ ₯ν•œ λ’€, λ§ˆμ§€λ§‰ '('도 좜λ ₯ 없이 pop ν•΄μ€€λ‹€.
  • μ—°μ‚°μžκ°€ λ‚˜μ™”μ„ λ•Œ stack에 top에 μžμ‹ λ³΄λ‹€ μš°μ„ μˆœμœ„κ°€ κ°™κ±°λ‚˜ 높은 μ—°μ‚°μžκ°€ 있으면 κ·Έ μ—°μ‚°μžλ₯Ό pop ν•΄μ£Όκ³  화면에 좜λ ₯ν•œλ‹€.
  • μš°μ„ μˆœμœ„κ°€ κ°™κ±°λ‚˜ 높은 μ—°μ‚°μžκ°€ λ‚˜μ˜€μ§€ μ•Šκ³  '('λ‚˜ stack이 빌 λ•ŒκΉŒμ§€ 계속 pop ν•΄μ£Όλ‹€κ°€ λ§Œλ‚˜κ²Œ 되면 push ν•΄μ€€λ‹€.

Description

  • (int i = 0; str[i] != '\0'; i++)둜 전체 λ¬Έμžμ—΄μ„ μˆœνšŒν–ˆμŠ΅λ‹ˆλ‹€.

#include <iostream>
#include <vector>
#include <stack>
using namespace std;
stack<char> s;
int main(void) {
    char str[101];
    cin >> str;
    stack<char> s;
    for (int i = 0; str[i] != '\0'; i++) {
        char value=str[i];
        if (value <= 'Z' && 'A' <= value) cout << value;
        else if (value == '(') s.push(value);
        else if (value == ')') {
            while (s.top() != '(') {
                cout << s.top();
                s.pop();
            }
            s.pop();
        }
        else if (s.empty()) s.push(value);
        else {
            while (!s.empty()) {
                if (s.top() == '(') {
                    s.push(value);
                    break;
                }
                else if (value == '+' || value == '-') {
                        cout << s.top();
                        s.pop();
                        continue;
                }
                else if (value == '*' || value == '/') {
                    if (s.top() == '*' || s.top() == '/') {
                        cout << s.top();
                        s.pop();
                        continue;
                    }
                    else {
                        s.push(value);
                        break;
                    }
                }
            }
            if (s.empty()) s.push(value);
        }
    }
    while (!s.empty()) {
        cout << s.top();
        s.pop();
    }
    cout << '\n';
    return 0;
}

'Algorithm > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ] μŠ€λ„μΏ (2580)  (0) 2022.03.10
[BOJ] 백쑰의 호수(3197)  (0) 2022.03.10
[BOJ] ν–‰μš΄μ˜ 바퀴(2840)  (0) 2022.03.10
[BOJ] νšŒμ „ν•˜λŠ” 큐(1021)  (0) 2022.03.10
[BOJ] 였λ₯΄λ§‰ 수(11057)  (0) 2022.03.09