📚 문제
[BOJ C++] 백준 25178번: 두라무리 휴지
https://www.acmicpc.net/problem/25178

📝 입력 및 출력

🔎 문제 풀이
- 먼저, 두 문자열을 입력받은 후, 첫 글자와 마지막 글자를 비교한다.
- 각 단어에서 모음(a, e, i, o, u)을 제거한 문자열은 동일해야 하고, 한 단어를 재배열했을 때 다른 단어를 만들 수 있어야하므로 두 문자열의 모음의 개수가 같아야 한다.
- 문자열의 맨 처음부터 맨 끝까지 순회하며 모음의 개수를 센다. switch 문을 사용하여 str1에서는 모음의 개수를 늘리고(+), str2에서는 모음의 개수를 줄였다(-). 두 문자열에 있는 모음의 개수가 같다면 순회를 마친 후 모음의 개수가 모두 0이어야 한다.
- 모음을 제거한 문자열을 비교하기 위해 tmp1, tmp2 문자열에 자음만 넣고 마지막에 비교한다. string의 erase() 함수를 사용하는 경우, 순회할 때 인덱스 값에 문제가 발생하기 때문에 새로운 문자열을 두어 비교했다.
- 각 경우에서 문제가 있는 경우, flag 값을 1로 바꾸어 표시했고, 결과를 출력할 때 flag가 1이면 문제가 있는 경우이므로 NO를, 0이면 올바른 경우이므로 YES를 출력한다.
⌨️ C++ 코드
더보기
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, flag = 0;
string str1, str2, tmp1 = "", tmp2 = "";
vector<int> v(5); // a, e, i, o, u 개수 저장.
cin >> n >> str1 >> str2;
if (str1[0] != str2[0]) flag = 1; // 첫 글자는 동일해야 함.
if (str1[n - 1] != str2[n - 1]) flag = 1; // 마지막 글자는 동일해야 함.
for (int i = 0; i < n; i++) {
switch (str1[i]) {
case 'a':
v[0]++;
break;
case 'e':
v[1]++;
break;
case 'i':
v[2]++;
break;
case 'o':
v[3]++;
break;
case 'u':
v[4]++;
break;
default: // 자음인 경우
tmp1 += str1[i];
break;
}
switch (str2[i]) {
case 'a':
v[0]--;
break;
case 'e':
v[1]--;
break;
case 'i':
v[2]--;
break;
case 'o':
v[3]--;
break;
case 'u':
v[4]--;
break;
default: // 자음인 경우
tmp2 += str2[i];
break;
}
}
if (tmp1.compare(tmp2)) flag = 1; // 모음을 제거한 문자열이 다른 경우.
for (int i = 0; i < 5; i++) { // 모음의 개수가 같아야 함.
if (v[i]) {
flag = 1;
break;
}
}
if (flag)
cout << "NO";
else
cout << "YES";
}
'백준 문제풀이' 카테고리의 다른 글
| [BOJ C++] 백준 12865번: 평범한 배낭 (0) | 2025.10.01 |
|---|---|
| [BOJ C++] 백준 28245번: 배고파(Hard) (0) | 2025.09.19 |
| [BOJ C++] 백준 33622번: 새치기하지 마!!! (0) | 2025.09.19 |
| [BOJ C++] 백준 16488번: 피카츄가 낸 어려운 문제 (0) | 2025.09.19 |
| [BOJ C++] 백준 32981번: 찐 Even Number (0) | 2025.09.19 |