백준 3986 좋은 단어 (C++)

REASON·2022년 9월 26일
0

알고리즘

목록 보기
14/20

백준 3986 좋은 단어

이상하다..? 분명히 맞은 로직 같은데 왜 결과가 이상할까..하고 디버깅하다가 보니 stack을 전역에 선언한 부분때문에 초기화가 안된 문제라는 것을 발견했다. ㅎㅎ

예전에 전역에 선언 안했다가 시간초과 났던 기억때문에 요즘에는 웬만하면 전역에 때려박아놓고 하다보니 생긴 또 다른 문제.. 깔깔ㅎㅎ
초기화시키는 걸 고려해야 할 때는 무작정 전역 변수로 선언하는 것을 다시 한번 고민해봐야겠다는 깨달음을 얻게 된 문제였다.

문제

이번 계절학기에 심리학 개론을 수강 중인 평석이는 오늘 자정까지 보고서를 제출해야 한다. 보고서 작성이 너무 지루했던 평석이는 노트북에 엎드려서 꾸벅꾸벅 졸다가 제출 마감 1시간 전에 깨고 말았다. 안타깝게도 자는 동안 키보드가 잘못 눌려서 보고서의 모든 글자가 A와 B로 바뀌어 버렸다! 그래서 평석이는 보고서 작성을 때려치우고 보고서에서 '좋은 단어'나 세보기로 마음 먹었다.

평석이는 단어 위로 아치형 곡선을 그어 같은 글자끼리(A는 A끼리, B는 B끼리) 쌍을 짓기로 하였다. 만약 선끼리 교차하지 않으면서 각 글자를 정확히 한 개의 다른 위치에 있는 같은 글자와 짝 지을수 있다면, 그 단어는 '좋은 단어'이다. 평석이가 '좋은 단어' 개수를 세는 것을 도와주자.

풀이 코드

#include <bits/stdc++.h>
using namespace std;
int n, ret;

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> n;
	for(int i = 0; i < n; i++){
		string s;
		cin >> s;
		
		stack<char> str;
		for(int j = 0; j < s.size(); j++){
			if(str.empty()){
				str.push(s[j]);
			} else {
				if(str.top() == s[j]){
					str.pop();
				}else{
					str.push(s[j]);
				}
			}
		}
		
		if(str.empty()) ret++;
	}
	
	cout << ret;
	
	return 0;
}

오 이것은 스택 문제이군! 하고 이제는 보면 어떤 문제인지 유형이 보이기 시작한 것 같다.
예전엔 봐도 어..뭐지.. 모르겠는데...... 였다면 그래도 지금은 한 열개 중에 한 두개 문제는 완벽히 푸는 방법은 몰라도 어떤 방법으로 풀어봐야겠다 하는 건 있지 않나 싶다. ㅎㅎ 자만하진 말아야지..

더 좋은 솔루션이 있는지도 찾아봐야겠다!

0개의 댓글