본문 바로가기

BAEKJOON/구현

백준 10384번 [팬그램](C++) -yes6686- 티스토리

728x90
SMALL

백준 문제 풀이: 10384번 [팬그램]


문제 링크: https://www.acmicpc.net/problem/10384

문제 설명:

주어진 문장이 팬그램인지 확인하는 문제입니다. 팬그램은 알파벳 26개가 모두 등장하는 문장을 말합니다. 또한, 각 알파벳이 2번 이상 등장하면 "Double pangram!!", 3번 이상 등장하면 "Triple pangram!!!"으로 분류됩니다. 문장이 팬그램이 아닌 경우에는 "Not a pangram"을 출력해야 합니다.


문제 해결 코드


#include <iostream>
#include <string>
#include <cstring> // memset 사용
using namespace std;

int alpha[26]; // 알파벳 등장 횟수 저장

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    
    int n;
    cin >> n; // 테스트 케이스 수 입력
    cin.ignore(); // 버퍼 비우기
    
    for (int i = 0; i < n; i++) {
        string s;
        getline(cin, s); // 문장 입력
        
        // 알파벳 등장 횟수 계산
        for (int j = 0; j < s.size(); j++) {
            if (s[j] >= 'a' && s[j] <= 'z') {
                alpha[s[j] - 'a']++;
            } else if (s[j] >= 'A' && s[j] <= 'Z') {
                alpha[s[j] - 'A']++;
            }
        }

        // 팬그램 종류 판별
        bool isTriple = true;
        bool isDouble = true;
        bool isPangram = true;

        for (int i = 0; i < 26; i++) {
            if (alpha[i] < 3) isTriple = false;
            if (alpha[i] < 2) isDouble = false;
            if (alpha[i] < 1) isPangram = false;
        }

        // 결과 출력
        cout << "Case " << i + 1 << ": ";
        if (isTriple) {
            cout << "Triple pangram!!!" << '\n';
        } else if (isDouble) {
            cout << "Double pangram!!" << '\n';
        } else if (isPangram) {
            cout << "Pangram!" << '\n';
        } else {
            cout << "Not a pangram" << '\n';
        }

        // 알파벳 배열 초기화
        memset(alpha, 0, sizeof(alpha));
    }
}

코드 설명

위 코드는 주어진 문장이 팬그램인지 판별하고, 팬그램 종류를 출력합니다. 주요 로직은 다음과 같습니다:

  1. 입력 처리: 테스트 케이스 수를 입력받고, 각 문장을 처리합니다.
  2. 알파벳 등장 횟수 계산: 소문자와 대문자를 모두 처리하여 각 알파벳의 등장 횟수를 계산합니다.
  3. 팬그램 판별: 각 알파벳의 등장 횟수를 기준으로 Triple, Double, 일반 팬그램 여부를 확인합니다.
  4. 결과 출력: 각 테스트 케이스에 대해 결과를 출력한 뒤, 등장 횟수 배열을 초기화합니다.

시간 복잡도:

  • 각 테스트 케이스마다 O(L) (문장의 길이)로 알파벳 등장 횟수를 계산합니다.
  • 전체 복잡도는 O(N × L)이며, N은 테스트 케이스 수, L은 문장의 평균 길이입니다.

결과

위 코드를 통해 문제를 해결할 수 있으며, 팬그램 여부와 종류를 정확히 판별합니다. 다른 접근 방식이나 최적화가 있다면 댓글로 공유 부탁드립니다!

728x90
LIST