• toc {:toc}

문제

κ³ μ°½μ˜μ€ μŠ€νƒμ„ 쑰금 λ³€ν˜•ν•΄μ„œ κ³ μŠ€νƒμ„ λ§Œλ“€μ—ˆλ‹€.

κ³ μŠ€νƒμ€ μˆ«μžλ§Œμ„ μ €μž₯ν•  수 있고, λ‹€μŒκ³Ό 같은 10 κ°€μ§€ 연산을 μˆ˜ν–‰ν•  수 μžˆλ‹€.

νŽΈμ˜μƒ μŠ€νƒμ˜ κ°€μž₯ μœ„μ— μ €μž₯된 수λ₯Ό 첫 번째 수라고 ν•˜κ³ , κ·Έ λ‹€μŒμ€ μ°¨λ‘€λŒ€λ‘œ 두 번째 수, μ„Έ 번째 수라고 ν•œλ‹€.

  • NUM X: X λ₯Ό μŠ€νƒμ˜ κ°€μž₯ μœ„μ— μ €μž₯ν•œλ‹€. (0 ≀ X ≀ 109)
  • POP: μŠ€νƒ κ°€μž₯ μœ„μ˜ 숫자λ₯Ό μ œκ±°ν•œλ‹€.
  • INV: 첫 번째 수의 λΆ€ν˜Έλ₯Ό λ°”κΎΌλ‹€. (42 β†’ -42)
  • DUP: 첫 번째 숫자λ₯Ό ν•˜λ‚˜ 더 μŠ€νƒμ˜ κ°€μž₯ μœ„μ— μ €μž₯ν•œλ‹€.
  • SWP: 첫 번째 μˆ«μžμ™€ 두 번째 숫자의 μœ„μΉ˜λ₯Ό μ„œλ‘œ λ°”κΎΌλ‹€.
  • ADD: 첫 번째 μˆ«μžμ™€ 두 번째 숫자λ₯Ό λ”ν•œλ‹€.
  • SUB: 첫 번째 μˆ«μžμ™€ 두 번째 숫자λ₯Ό λΊ€λ‹€. (두 번째 - 첫 번째)
  • MUL: 첫 번째 μˆ«μžμ™€ 두 번째 숫자λ₯Ό κ³±ν•œλ‹€.
  • DIV: 첫 번째 숫자둜 두 번째 숫자λ₯Ό λ‚˜λˆˆ λͺ«μ„ μ €μž₯ν•œλ‹€. 두 번째 μˆ«μžκ°€ ν”Όμ œμˆ˜, 첫 번째 μˆ«μžκ°€ μ œμˆ˜μ΄λ‹€.
  • MOD: 첫 번째 숫자둜 두 번째 숫자λ₯Ό λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό μ €μž₯ν•œλ‹€. 두 번째 μˆ«μžκ°€ ν”Όμ œμˆ˜, 첫 번째 μˆ«μžκ°€ μ œμˆ˜μ΄λ‹€.

이항 μ—°μ‚°μžμ˜ κ²½μš°μ— 첫 번째 μˆ«μžκ°€ 였λ₯Έμͺ½μ— μžˆλŠ” 수이고, 두 번째 μˆ«μžκ°€ μ™Όμͺ½μ— μžˆλŠ” μˆ˜μ΄λ‹€. 또, 연산을 μˆ˜ν–‰ν•˜κΈ° 전에 두 숫자λ₯Ό λͺ¨λ‘ μŠ€νƒμ—μ„œ μ œκ±°ν•œ λ’€, κ²°κ³Όλ₯Ό λ‹€μ‹œ μŠ€νƒμ— μ €μž₯ν•˜λŠ” 것이닀.

μˆ«μžκ°€ λΆ€μ‘±ν•΄μ„œ 연산을 μˆ˜ν–‰ν•  수 없을 λ•Œ, 0 으둜 λ‚˜λˆ΄μ„ λ•Œ (DIV, MOD), μ—°μ‚° 결과의 μ ˆλŒ“κ°’μ΄ 109 λ₯Ό λ„˜μ–΄κ°ˆ λ•ŒλŠ” λͺ¨λ‘ ν”„λ‘œκ·Έλž¨ μ—λŸ¬μ΄λ‹€.

음수 λ‚˜λˆ—μ…ˆμ— λŒ€ν•œ λͺ¨ν˜Έν•¨μ„ ν”Όν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같이 κ³„μ‚°ν•œλ‹€. λ‚˜λˆ—μ…ˆμ˜ ν”Όμ—°μ‚°μžμ— μŒμˆ˜κ°€ μžˆμ„ λ•ŒλŠ”, κ·Έ 수λ₯Ό μ ˆλŒ“κ°’μ„ μ”Œμš΄ λ’€ κ³„μ‚°ν•œλ‹€. 그리고 λ‚˜μ„œ λͺ«κ³Ό λ‚˜λ¨Έμ§€μ˜ λΆ€ν˜ΈλŠ” λ‹€μŒκ³Ό 같이 κ²°μ •ν•œλ‹€. ν”Όμ—°μ‚°μžμ€‘ μŒμˆ˜κ°€ ν•œ κ°œμΌλ•ŒλŠ” λͺ«μ˜ λΆ€ν˜Έκ°€ μŒμˆ˜μ΄λ‹€. 이 경우λ₯Ό μ œμ™Έν•˜λ©΄ λͺ«μ˜ λΆ€ν˜ΈλŠ” 항상 μ–‘μˆ˜μ΄λ‹€. λ‚˜λ¨Έμ§€μ˜ λΆ€ν˜ΈλŠ” ν”Όμ œμˆ˜μ˜ λΆ€ν˜Έμ™€ κ°™λ‹€. λ”°λΌμ„œ, 13 div -4 = -3, -13 mod 4 = -1, -13 mod -4 = -1 이닀.

ν”„λ‘œκ·Έλž¨ μ—λŸ¬κ°€ λ°œμƒν–ˆμ„ κ²½μš°μ—λŠ”, ν˜„μž¬ ν”„λ‘œκ·Έλž¨μ˜ μˆ˜ν–‰μ„ λ©ˆμΆ”κ³ , κ·Έ λ‹€μŒ μ–΄λ–€ λͺ…령도 μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€.

μž…λ ₯

μž…λ ₯은 기계 μ—¬λŸ¬ λŒ€μ˜ μ„€λͺ…μœΌλ‘œ 이루어져 μžˆλ‹€. 각 κΈ°κ³„μ˜ μ„€λͺ…은 ν”„λ‘œκ·Έλž¨κ³Ό μž…λ ₯μ˜μ—­μœΌλ‘œ λ‚˜λˆ„μ–΄μ Έ μžˆλ‹€.

ν”„λ‘œκ·Έλž¨μ€ λͺ…λ Ήμ–΄λ‘œ 이루어져 있고, λͺ…λ Ήμ–΄λŠ” ν•œ 쀄에 ν•˜λ‚˜μ”© μžˆλ‹€. 각 λͺ…령은 문제 μ„€λͺ…에 λ‚˜μ™€μžˆλŠ” λŒ€λ¬Έμž μ•ŒνŒŒλ²³ 3 κΈ€μžμ΄κ³ , λ‹€λ₯Έ κΈ€μžλŠ” μ£Όμ–΄μ§€μ§€ μ•ŠλŠ”λ‹€. NUM 의 κ²½μš°μ—λŠ” λͺ…λ Ήμ–΄ λ‹€μŒμ— μˆ«μžκ°€ μ£Όμ–΄μ§€λ©°, 이 μˆ«μžλŠ” 0 보닀 ν¬κ±°λ‚˜ κ°™κ³ , 109 보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜μ΄λ‹€. NUM κ³Ό μˆ«μžλŠ” 곡백으둜 κ΅¬λΆ„λ˜μ–΄μ Έ μžˆλ‹€. 각 ν”„λ‘œκ·Έλž¨μ€ END κ°€ λ‚˜μ˜€λ©΄ λλ‚œλ‹€.

μž…λ ₯μ˜μ—­μ€ 첫째 쀄에 ν”„λ‘œκ·Έλž¨ μˆ˜ν–‰ 횟수 N 이 μžˆλ‹€. (0 ≀ N ≀ 10,000) λ‹€μŒ N 개의 μ€„μ—λŠ” ν•œ 쀄에 ν•˜λ‚˜μ”© μž…λ ₯κ°’ Vi κ°€ μžˆλ‹€. (0 ≀ Vi ≀ 109) 각 μž…λ ₯값에 λŒ€ν•΄μ„œ ν”„λ‘œκ·Έλž¨μ„ ν•œ λ²ˆμ”© μˆ˜ν–‰ν•΄μ•Ό ν•˜κ³ , 이 μˆ˜ν–‰μ€ λͺ¨λ‘ 독립적이닀. 맀번 ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•  λ•Œ, μŠ€νƒμ— λ“€μ–΄μžˆλŠ” 값은 μž…λ ₯κ°’ ViΒ ν•˜λ‚˜μ΄λ‹€.

각각의 기계 μ„€λͺ…은 빈 μ€„λ‘œ κ΅¬λΆ„λ˜μ–΄μ Έ μžˆλ‹€. QUIT 이 λ‚˜μ˜€λ©΄ λ‹€μŒ 기계 μ„€λͺ…이 μ—†λ‹€λŠ” λœ»μ΄λ‹€. λͺ…λ Ήμ–΄κ°€ 100,000 개λ₯Ό λ„˜μ–΄κ°€λŠ” κ²½μš°μ™€ μŠ€νƒμ΄ μˆ˜ν–‰λ  λ•Œ, 1,000 개 μ΄μƒμ˜ 숫자λ₯Ό μ €μž₯ν•˜λŠ” κ²½μš°λŠ” μ—†λ‹€.

좜λ ₯

각각의 μž…λ ₯값에 λŒ€ν•΄μ„œ, ν•΄λ‹Ήν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•œ λ’€, 좜λ ₯값을 좜λ ₯ν•˜λ©΄ λœλ‹€. 좜λ ₯κ°’μ΄λž€ μŠ€νƒμ— μ €μž₯λ˜μ–΄ μžˆλŠ” μˆ«μžμ΄λ‹€.

λ§Œμ•½, ν”„λ‘œκ·Έλž¨ μ—λŸ¬κ°€ λ°œμƒν•˜κ±°λ‚˜, λͺ¨λ“  μˆ˜ν–‰μ΄ μ’…λ£Œλμ„ λ•Œ μŠ€νƒμ— μ €μž₯λ˜μ–΄ μžˆλŠ” μˆ«μžκ°€ 1 κ°œκ°€ μ•„λ‹ˆλΌλ©΄, β€œERROR” λ₯Ό 좜λ ₯ν•œλ‹€.

각 기계에 λŒ€ν•œ 좜λ ₯값을 λͺ¨λ‘ 좜λ ₯ν•œ λ’€μ—λŠ” 빈 쀄을 ν•˜λ‚˜ 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

풀이

쑰건이 μ—¬λŸ¬ κ°€μ§€λ‘œ μƒλ‹Ήνžˆ λ§Žμ§€λ§Œ 생각없이 λ¬΄μž‘μ • 달렀듀어 μ½”λ“œλΆ€ν„° μž‘μ„±ν–ˆλ‹€. κ²°κ΅­ κ²°κ³ΌλŠ” λ””λ²„κΉ…μ—λ§Œ 4~5 μ‹œκ°„μ€ μ“΄ 것 κ°™λ‹€. μ „μ²΄μ μœΌλ‘œ 쑰건을 ν™•μΈν•œ ν›„, 전체적인 틀을 κ΅¬μƒν•˜κ³  μ ‘κ·Όν•  ν•„μš”κ°€ μžˆλ‹€.

  • κ³ μŠ€νƒμ˜ λ™μž‘ λΆ€λΆ„
    • 첫 번째, 두 번째 수λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 μˆœμ„œμ— μœ μ˜ν•œλ‹€.
    • ERROR 쑰건에 μœ μ˜ν•œλ‹€. (μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ” 경우, 2 개의 수λ₯Ό μ΄μš©ν•˜λŠ”λ° μŠ€νƒμ— 1 개의 κ°’λ§Œ μžˆλŠ” 경우)
  • main λΆ€λΆ„
    • QUIT ν•˜κΈ° μ „ μ—¬λŸ¬ ν”„λ‘œκ·Έλž¨ λͺ…λ Ήμ–΄ λ­‰μΉ˜λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 각 μŠ€νƒ, 벑터, error λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•΄μ€˜μ•Ό ν•œλ‹€.
    • ERROR 쑰건에 μœ μ˜ν•œλ‹€. (μŠ€νƒμ— μ €μž₯된 μˆ«μžκ°€ 1 κ°œκ°€ 아닐 λ•Œ, ν”„λ‘œκ·Έλž¨ μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ break)

long long μ μš©μ— μžˆμ–΄ μ‚¬μš©λ˜λŠ” μžλ£Œν˜•μ„ μ „λΆ€ 확인해봐야 ν•œλ‹€. μ•„λ‹ˆλ©΄ κ³ μƒν•œλ‹€β€¦

#include <bits/stdc++.h>
using namespace std;
#define MAX 1000000000
typedef long long LL;
stack<LL> st;
 
bool num(LL x){
    st.push(x);
    return false;
}
 
bool pop(){
    // μŠ€νƒμ— 아무것도 없을 λ•Œ
    if (st.empty()) return true;
 
    st.pop();
    return false;
}
 
bool inv(){
    // μŠ€νƒμ— 아무것도 없을 λ•Œ
    if (st.empty()) return true;
 
    int temp;
    temp = -st.top();
    st.pop();
    st.push(temp);
    return false;
}
 
bool dup(){
    if (st.empty()) return true;
    int temp;
    temp = st.top();
    st.push(temp);
    return false;
}
 
bool swp(){
    if (st.size() < 2) return true;
    int fst, snd;
    fst = st.top();
    st.pop();
    snd = st.top();
    st.pop();
    st.push(fst);
    st.push(snd);
    return false;
}
bool add(){
    if (st.size() < 2) return true;
    LL temp, fst, snd;
    fst = st.top();
    st.pop();
    snd = st.top();
    st.pop();
    temp = fst + snd;
    st.push(temp);
    return false;
}
bool sub(){
    if (st.size() < 2) return true;
    LL temp, fst, snd;
    fst = st.top();
    st.pop();
    snd = st.top();
    st.pop();
    temp = snd-fst;
    st.push(temp);
    return false;
}
bool mul(){
    if (st.size() < 2) return true;
    LL temp, fst, snd;
    fst = st.top();
    st.pop();
    snd = st.top();
    st.pop();
    temp = snd*fst;
 
    st.push(temp);
    return false;
}
bool div(){
    if (st.size() < 2) return true;
    LL temp, fst, snd;
    bool minus = false;
    fst = st.top();
    st.pop();
    snd = st.top();
    st.pop();
    if (fst == 0) return true;
 
    // 음수일 λ•Œ μ—°μ‚° 쑰건 μΆ”κ°€
    if ((snd > 0 && fst < 0) || (snd < 0 && fst > 0)) minus = true;
    temp = abs(snd) / abs(fst);
    if (minus == true) temp = -temp;
    st.push(temp);
    return false;
}
bool mod(){
    if (st.size() < 2) return true;
    LL temp, fst, snd;
    bool minus = false;
    fst = st.top();
    st.pop();
    snd = st.top();
    st.pop();
    if (fst == 0) return true;
    
    if (snd < 0) minus = true;
    temp = abs(snd) % abs(fst);
    if (minus == true) temp = -temp;
    st.push(temp);
    return false;
}
 
int main(){
    LL n, val, cnt = 0;
    bool error;
    string str;
    vector<string> cmd;
    vector<int> n_val;
 
 
    while(true){
        error = false;
        cmd.clear();
        n_val.clear();
        while(true){
            cin >> str;
            if (str == "NUM") {
                cin >> val;
                n_val.push_back(val);
            }
            else if (str == "QUIT") {
                return 0;
            }
            else if (str == "END") {
                break;
            }
            cmd.push_back(str);
        }
        cin >> n;
 
        while(n--){
            cnt = 0;
            cin >> val;
            st.push(val);
            
            for(int i=0; i<cmd.size(); i++){
                if (cmd[i] == "NUM") error = num(n_val[cnt++]);
                else if (cmd[i] == "POP") error = pop();
                else if (cmd[i] == "INV") error = inv();
                else if (cmd[i] == "DUP") error = dup();
                else if (cmd[i] == "SWP") error = swp();
                else if (cmd[i] == "ADD") error = add();
                else if (cmd[i] == "SUB") error = sub();
                else if (cmd[i] == "MUL") error = mul();
                else if (cmd[i] == "DIV") error = div();
                else if (cmd[i] == "MOD") error = mod();
 
                if (!st.empty() && (st.top() > MAX || st.top() < -MAX))
                    error = true;
                
                if (error) break;
            }
            
            if ((st.size() == 1) && error == false) {
                cout << st.top() << endl;
            }
            else {
                cout << "ERROR" << endl;
            }
            while(!st.empty()) {
                st.pop();
            }
            
        }
        cout << endl;
    }
 
    return 0;
}

μ˜€λ‹΅λ…ΈνŠΈ

  1. λ‹€μŒμ˜ 계산 κ²°κ³Όκ°’μ˜ μ ˆλŒ“κ°’μ΄ 1e9 보닀 큰 경우λ₯Ό 각 λ™μž‘ ν•¨μˆ˜μ— 넣을 경우
if (!st.empty() && (st.top() > MAX || st.top() < -MAX))
    error = true;
  1. ν•¨μˆ˜ ν˜•νƒœλ‘œ λ°›μ§€ μ•Šκ³  stack.push 둜 μ²˜λ¦¬ν•˜λŠ” 경우
if (cmd[i] == "NUM") error = num(n_val[cnt++]);
->
if (cmd[i] == β€œNUM”) st.push(n_val[cnt++]);

μ°Έκ³ λ¬Έν—Œ

BOJ 3425 κ³ μŠ€νƒ

μ—°κ²°λ¬Έμ„œ