Stack

--·2022년 7월 10일
0

Silver 10773

첫시도

#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변수를 만들어서 상수값을 이용한다.

Broze 9390

첫시도

#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)인 스택을 이용하여 풀 수 있을 것 같았다

  1. cin.ignore()
    cin을 이용하여 T를 받을 경우 버퍼에 \n이 남아 있어서 \n을 읽을 수 있는 getline()함수가 읽어버려서 입력하기도 전에 프로그램이 종료된다
    -> cin.ignore()로 버퍼를 비우니 해결 되었다.

  2. s=s+''
    문장의 중간은 ''이고 마지막은 \n이지만 연산의 편리를 위하여 s맨 뒤에 ''을 추가하여 for문 안에있는 if문을 더 편리하게 만들었다.

0개의 댓글