※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 27466번 문제인 그래서 대회 이름 뭐로 하죠이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/27466
27466번: 그래서 대회 이름 뭐로 하죠
오늘도 운영진은 대회 이름을 정하고 있다. 몇 주째 대회 이름을 못 정하고 구글 드라이브, 지문/에디토리얼 파일, 디스코드 서버에 대회 이름으로 "대회 이름 뭐로 하죠"를 사용하고 있다. 그러
www.acmicpc.net
주어진 문자열 s의 마지막 세 글자가 조건을 만족하게끔 뒤에서부터 불필요한 문자를 하나씩 제거해나가는 전략으로 문제를 해결하자.
구체적으로, 먼저 문자열의 마지막 문자는 자음이어야 한다는 조건을 만족시키기 위해 마지막 문자가 자음이 될 때까지 마지막 문자를 지워주자. 그리고 그 조건을 만족시키는 자음이 무엇인지를 저장해두고 이제 뒤에서 두번째 문자를 찾기 위해 문자열에서 그 자음 또한 지워주자.
다음으로 문자열의 뒤에 와야 하는 문자 두개는 'A'이다. 조건을 만족시키기 위해 위와 같은 방식으로 'A'가 아닌 문자를 지우고 'A를 하나 저장한 뒤 그 'A'를 지우는 작업을 두 번 반복하자.
이와 같은 제거과정을 끝마쳤을 때 남은 문자의 개수가 M보다 적다면 문제의 조건을 만족하는 문자열이 존재하지 않는다고 판단할 수 있다.
과정을 끝마치기 전에 문자열이 빈 문자열이 될 수 있으므로 이 경우에 유의해 코드를 작성해야한다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using namespace std;
int N, M;
string s;
vector<char> ans;
bool vowel[128];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
vowel['A'] = vowel['E'] = vowel['I'] = vowel['O'] = vowel['U'] = 1;
cin >> N >> M >> s;
while (!s.empty() && vowel[s.back()]) s.pop_back();
if (s.empty()) {
cout << "NO";
return 0;
}
ans.emplace_back(s.back()); s.pop_back();
while (!s.empty() && s.back() > 'A') s.pop_back();
if (s.empty()) {
cout << "NO";
return 0;
}
ans.emplace_back(s.back()); s.pop_back();
while (!s.empty() && s.back() > 'A') s.pop_back();
if (s.empty()) {
cout << "NO";
return 0;
}
ans.emplace_back(s.back()); s.pop_back();
if (s.length() + 3 < M) {
cout << "NO";
return 0;
}
cout << "YES\n";
cout << s.substr(0, M - 3);
while (!ans.empty()) {
cout << ans.back();
ans.pop_back();
}
}
'BOJ' 카테고리의 다른 글
[BOJ 1802 // C++] 종이 접기 (0) | 2023.02.19 |
---|---|
[BOJ 25276 // C++] Sperhling (0) | 2023.02.19 |
[BOJ 16173 // C++] 점프왕 쩰리 (Small) (0) | 2023.02.18 |
[BOJ 1184 // C++] 귀농 (0) | 2023.02.18 |
[BOJ 3042 // C++] 트리플렛 (0) | 2023.02.18 |