문제 설명
이번 계절학기에 심리학 개론을 수강 중인 평석이는 오늘 자정까지 보고서를 제출해야 한다. 보고서 작성이 너무 지루했던 평석이는 노트북에 엎드려서 꾸벅꾸벅 졸다가 제출 마감 1시간 전에 깨고 말았다. 안타깝게도 자는 동안 키보드가 잘못 눌려서 보고서의 모든 글자가 A와 B로 바뀌어 버렸다! 그래서 평석이는 보고서 작성을 때려치우고 보고서에서 '좋은 단어'나 세보기로 마음 먹었다.
평석이는 단어 위로 아치형 곡선을 그어 같은 글자끼리(A는 A끼리, B는 B끼리) 쌍을 짓기로 하였다. 만약 선끼리 교차하지 않으면서 각 글자를 정확히 한 개의 다른 위치에 있는 같은 글자와 짝 지을수 있다면, 그 단어는 '좋은 단어'이다. 평석이가 '좋은 단어' 개수를 세는 것을 도와주자.
입력
첫째 줄에 단어의 수 N이 주어진다. (1 ≤ N ≤ 100)
다음 N개 줄에는 A와 B로만 이루어진 단어가 한 줄에 하나씩 주어진다. 단어의 길이는 2와 100,000사이이며, 모든 단어 길이의 합은 1,000,000을 넘지 않는다.
출력
첫째 줄에 좋은 단어의 수를 출력한다.
문제 해결
각 단어 예시로 AABBA 는 짝이 다 지어지지않기 때문에 좋은단어가 아니다.
ABAB도 짝지을때 선이 교차하기 때문에 좋은단어가 아니다.
AABB, ABBA는 좋은단어이다. 이러한 예시를 볼 때 Stack을 이용해서 문제를 풀 수 있다.
stack이 비어있으면 입력값을 넣고, 비어있지 않을때는 stack의 top과 현재 입력값이 같다면 stack을 pop하고 그렇지 않다면 push한다. 이 후 단어 한 줄이 끝나면 stak이 empty()한지 아닌지에 따라 좋은단어인지 아닌지를 판단한다.
코드
#include <iostream>
#include <stack>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int N, ans = 0;
cin >> N;
string ab;
while (N--)
{
stack<char> stk;
cin >> ab;
for (int i = 0; i < ab.length(); i++)
{
if (stk.empty())
{
stk.push(ab[i]);
}
else {
if (stk.top() == ab[i])
{
stk.pop();
}
else
{
stk.push(ab[i]);
}
}
}
if (stk.empty())
ans++;
}
cout << ans;
}
처음에 한 줄 씩 단어라는 점을 제대로 보지않고 aa,bb 이런식으로 단어라 생각을 해서 abba는 교차하니까 좋은단어가 아니라 생각했다. 하지만 abab처럼 교차하는게 좋지않은 단어였고 처음 생각대로 문제를 푸니까 삽질을 제대로 했다..........
문제를 보고 잘 해석하는 능력도 필요한거같다.. 파이팅.
'알고리즘 > 문제풀이 (C++,Kotlin)' 카테고리의 다른 글
[BOJ/C++] 1926번 그림 : BFS (0) | 2023.01.12 |
---|---|
[BOJ/C++] 9012번 괄호 (0) | 2023.01.11 |
[BOJ/C++] 4949번 균형잡힌 세상 (0) | 2023.01.09 |
[BOJ/C++] 10814번 나이순 정렬 (0) | 2023.01.07 |
[BOJ/C++] 1021번 회전하는 큐 (0) | 2023.01.06 |