백준 문제풀이

[BOJ C++] 백준 25178번: 두라무리 휴지

audxkawjd17 2025. 9. 19. 21:56

 📚 문제

[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";
}