![[백준 3986] 좋은 단어 (C++)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMwFaR%2FbtsyD7y2DBo%2FjyPW5qQpkVD8bfpLX9H9Q0%2Fimg.png)
1. 문제
https://www.acmicpc.net/problem/3986
3986번: 좋은 단어
이번 계절학기에 심리학 개론을 수강 중인 평석이는 오늘 자정까지 보고서를 제출해야 한다. 보고서 작성이 너무 지루했던 평석이는 노트북에 엎드려서 꾸벅꾸벅 졸다가 제출 마감 1시간 전에
www.acmicpc.net
A와 B를 입력받고 같은 문자끼리 짝을 짓는 문제이다. 이때 아치형 곡선을 그어 서로의 곡선이 겹치지 않게 만든다
2. 풀이
아치형 곡선을 그어 서로의 곡선이 겹치지 않게 만든다는 말은 다음과 같이 바꿔 해석할 수 있다.
- 홀수 번째 입력받은 A를 ' ( '로, 짝수 번째 입력받은 A를 ' ) '로 치환하여 괄호쌍을 짝짓는 문제로도 볼 수 있다.
마찬가지로 B도
- 홀수 번째 입력받은 B를 ' [ '로, 짝수 번째 입력받은 B를 ' ] '로 치환하여 괄호쌍을 짝지을 수 있다.
즉 stack을 활용하는 전형적인 괄호쌍문제이다.
예시
예를 들어 입력값이 ABAB일 경우 "( [ ) ]" 로 볼 수 있으므로 짝이 안맞아 좋은 단어가 아니다.
반면에 입력값이 BAABBB인 경우 "[ ( ) [ ] ]" 로 볼 수 있으므로 짝이 맞아 좋은 단어이다.
괄호쌍의 자세한 풀이는 "[백준 4949번] 균형잡힌 세상"을 참고하면 더 쉽게 이해할 수 있다.
https://wondrous-developer.tistory.com/2
[백준 4949번] 균형잡힌 세상 (C++)
깔끔하게 구현한 최종 코드는 맨 아래에 정리해 두었다. 1. 문제 https://www.acmicpc.net/problem/4949 4949번: 균형잡힌 세상 각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("
wondrous-developer.tistory.com
3. 코드
stack의 자료구조를 이용하여 풀어 구현한다.
#include<iostream>
#include<string>
#include<stack>
using namespace std;
stack<char> sta;
string str;
int main(void) {
cin.tie(0);
ios::sync_with_stdio(false);
int T;
int sum = 0;
cin >> T;
while (T--) {
cin >> str;
int len = str.length();
int index = 0;
while (index < len) {
if (sta.empty()) {
sta.push(str[index++]);
continue;
}
if (sta.top() == str[index]) sta.pop();
else sta.push(str[index]);
index++;
}
if (sta.empty()) sum++;
while (!sta.empty()) {
sta.pop();
}
}
cout << sum;
return 0;
}
'PS > 백준 알고리즘[BOJ]' 카테고리의 다른 글
[백준 1074번] Z (C++) (0) | 2023.10.18 |
---|---|
[백준 10799번] 쇠막대기 (C++) (0) | 2023.10.12 |
[백준 9012번] 괄호 (C++) (0) | 2023.10.12 |
[백준 4949번] 균형잡힌 세상 (C++) (0) | 2023.10.12 |
[백준 17609] 회문 (C++) (0) | 2023.10.09 |
경이로운 BE 개발자가 되기 위한 프로그래밍 공부 기록장
도움이 되었다면 "❤️" 또는 "👍🏻" 해주세요! 문의는 아래 이메일로 보내주세요.