#include <iostream>
#include <stack>
using namespace std;
int main() {
int N,user,sum=0,size;
cin >> N;
stack<int> K;
for (int i = 0; i < N; i++) {
cin >> user;
if (user != 0) {
K.push(user);
}
else {
K.pop();
}
}
for (int i = 0; i < K.size(); i++) {
sum = sum + K.top();
K.pop();
}
cout << sum;
return 0;
}
문제에서 주어진 두번째 입력 값을 넣었을 때 Stack에 있는 원소 {1, 6}을 더하여 7이 출력 되어야하는데 계속 6이 출력 됐다
오류를 찾으려고 여러가지 시도 해보았지만 찾지 못하였다.
#include <iostream>
#include <stack>
using namespace std;
int main() {
int N,user,sum=0,size;
cin >> N;
stack<int> K;
for (int i = 0; i < N; i++) {
cin >> user;
if (user != 0) {
K.push(user);
}
else {
K.pop();
}
}
size = K.size();
for (int i = 0; i < size; i++) {
sum = sum + K.top();
K.pop();
}
cout << sum;
return 0;
}
디버깅을 하면서 Stack에 {1, 6}이 있는 것을 확인하였고 sum = sum + K.top()
에서 6만 더해지고 1이 안 더해지는 것을 확인하고 집중해서 본 결과 i < K.size()
에서 i = 0
일때 한번 순환하고 for문의 i가 1이 되면서 조건식을 확인한다
i < K.size()
에서 K.size() = 1
이므로 for문의 조건식에 맞지 않으므로 for문을 종료한다.
깨달은 점 : Stack, Queue에서 for문의 조건식을 쓸때 K.size()
와 같이 쓰면 유동적이므로 size=K.size()
처럼 size
변수를 만들어서 상수값을 이용한다.
#include <iostream>
#include <string>
#include <stack>
using namespace std;
stack<char> sta;
int main() {
int T; //테스트 케이스
string s; //단어길이 20, 문장 길이 1000
cin >> T;
cin.ignore();
for (int i = 0; i < T; i++) {
getline(cin, s);
s =s+ ' ';
for (int i = 0; i < s.length(); i++) {
if (s[i] == ' ') {
while (!sta.empty()) {
cout << sta.top();
sta.pop();
}
cout << ' ';
}
else {
sta.push(s[i]);
}
}
cout << '\n';
}
return 0;
}
처음에 문제를 보고 문자열이 뒤집어져있길래 reverse로 풀려하다가 익숙하지 않아 자꾸 오류가 나서 다시 생각해보니 LIFO(Last In First Out)인 스택을 이용하여 풀 수 있을 것 같았다
cin.ignore()
cin을 이용하여 T를 받을 경우 버퍼에 \n이 남아 있어서 \n을 읽을 수 있는 getline()함수가 읽어버려서 입력하기도 전에 프로그램이 종료된다
-> cin.ignore()로 버퍼를 비우니 해결 되었다.
s=s+''
문장의 중간은 ''이고 마지막은 \n이지만 연산의 편리를 위하여 s맨 뒤에 ''을 추가하여 for문 안에있는 if문을 더 편리하게 만들었다.