백준 3986(좋은 단어)

jh Seo·2022년 11월 3일
0

백준

목록 보기
64/180

개요

백준 3986번: 좋은 단어

  • 입력
    첫째 줄에 단어의 수 N이 주어진다. (1 ≤ N ≤ 100)

    다음 N개 줄에는 A와 B로만 이루어진 단어가 한 줄에 하나씩 주어진다. 단어의 길이는 2와 100,000사이이며, 모든 단어 길이의 합은 1,000,000을 넘지 않는다.

  • 출력
    첫째 줄에 좋은 단어의 수를 출력한다.

접근 방식

  1. 백준 9012번 (괄호) 문제와 유사하다.
    해당 문제에선 (과 )을 배열하는 문제라면 이 문제는 A와 B를 배열하는 문제다.
  2. 스택을 통해 스택이 비어있거나 스택의 top값과 이번에 넣는 문자가 같지 않다면
    해당 스택에 바로 push()
  3. 스택의 top값과 이번에 넣으려는 문자가 다르다면 스택 pop()

코드

#include<iostream>
#include<stack>
using namespace std;
int N;
string inputStr[101];
stack<char> s;

void input() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> inputStr[i];
	}
}
/// <summary>
/// index번째의 단어를 조사
/// </summary>
/// <param name="입력 string배열의 index"></param>
/// <returns>좋은 단어라면 1 아니라면 0</returns>
int checkStr(int index) {
	//스택 초기화
	while (!s.empty()) {
		s.pop();
	}
	//해당 index의 문자열의 각 문자를 조사
	for (int i = 0; i < inputStr[index].length(); i++) {
		//스택 비어있다면 i번째 문자 푸시
		if (s.empty())
			s.push(inputStr[index][i]);
		//스택의 top과 i번째 문자를 비교해서 같다면 스택 pop해줌
		else if (s.top() == inputStr[index][i])
		{
			s.pop();
		}
		//다르다면 스택에 i번째 문자 푸시
		else
			s.push(inputStr[index][i]);
	}
	//반복문 끝나고 스택 비어있다면 좋은 단어이므로 1
	if (s.empty()) return 1;
	//스택에 뭔가 차있다면 나쁜단어이므로 0 
	else return 0;
}

void solution() {
	int Ans = 0;
	for (int i = 0; i < N; i++) {
		Ans+=checkStr(i);
	}
	cout << Ans;
	
}

int main() {
	input();
	solution();
}

생각

각 checkStr()함수에서 같은 스택을 쓰게되는데 이 스택을 초기화를 깜박해서
처음에 틀렸었다. 흠 신경쓰자

profile
코딩 창고!

0개의 댓글