본문 바로가기

Algorithm/자료구조

[Stack] 백준 3986번: 좋은 단어

 이 문제는 문제만 이해하면 금방 풀 문제이다.  stack을 이용해서 다음 문자와 stack에 있는 top 문자와 같으면 두 문자를 pop해주면 되는 문제! 자세한 내용은 코드를 직접 보면서 참고하자.

3986번: 좋은 단어 문제

 

 여기서 한번더 집고 가야 할 문제는 cin과 string::getline() 함수를 같이 쓰면 헷깔리게 되는 점에 대해 이야기 하려고 한다. getline에 대한 포스팅은 다음 포스팅에 더 자세히 나와있다.

https://summer-story.tistory.com/7

 

[기초다지기] 백준 문제집으로 시작하기 #1

어떻게 시작하면 좋을까, 알고리즘? 코딩은 좀 해봤는데 뭔가 기초가 부족한 것 같기도 하고, 기초를 다지고는 싶은데 어떻게 시작해야될지는 모르겠고.. 나름 알고리즘을 공부한다고 백준 알고리즘을 주제별로는..

summer-story.tistory.com

 

 보통 나는 cin은 단순한 변수를 받고 싶을 때, getline은 한 줄 전체를 받고 뭔가 요리조리하고 싶을 때 사용한다. 근데 항상 실수하는 부분이 있다면 두 함수를 동시에 썼을 때 무엇이 저장되어 있는가이다.

 처음에 내가 문자들을 입력받고 싶어 썻던 코드를 보면 몇 개의 case가 나오냐를 cin으로 받고, 그 다음 문자열들을 string::getline() 함수로 받았다. 이렇게 쓰게되면 문제점은 cin에 있는 입력스트림을 이미 위에서 저장했으므로 그 버퍼는 비어 원하는 문자열을 바로 못 받아드린다는 말이다. 

 말로 풀어쓰려니 어려우니 사진을 보면서 이해하자....  ಠ_ಠ

 

잘못된 코드
잘못된 출력
 올바른 출력

 

(코드는 꼭 한번 풀어보고 참고하세요. c++)

코드 

...더보기
#include <iostream>
#include <stack>
#include <string>

using namespace std;

int main(){

	int num;
	cin >> num;

	int count = 0; 
	int result = 0; 

	while(count < num){
		string line; 
		cin >> line;

		stack<char> s;

		for(int i =0; i< line.length(); i++){
			if(!s.empty()){
				if(line[i] == s.top()) s.pop();
				else s.push(line[i]);
			}
			else s.push(line[i]);
		}

		if(s.empty()) result++;

		count++;
	}

	cout << result <<endl;	

	return 0;
}

 

 

'Algorithm > 자료구조' 카테고리의 다른 글

[Stack] 백준 2493번: 탑  (0) 2019.07.28
[Stack] 백준 1918번: 후위 표기식  (0) 2019.07.24
[자료구조] 백준 Stack  (0) 2019.07.10