- 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;
}μ€λ΅λ ΈνΈ
- λ€μμ κ³μ° κ²°κ³Όκ°μ μ λκ°μ΄ 1e9 λ³΄λ€ ν° κ²½μ°λ₯Ό κ° λμ ν¨μμ λ£μ κ²½μ°
if (!st.empty() && (st.top() > MAX || st.top() < -MAX))
error = true;- ν¨μ ννλ‘ λ°μ§ μκ³ stack.push λ‘ μ²λ¦¬νλ κ²½μ°
if (cmd[i] == "NUM") error = num(n_val[cnt++]);
->
if (cmd[i] == βNUMβ) st.push(n_val[cnt++]);