본문 바로가기

BAEKJOON/구현

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

728x90
반응형
SMALL

백준 문제 풀이: 5704 (팬그램)


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

문제 설명:

입력으로 주어진 문자열이 **팬그램**인지 확인하는 문제입니다. 팬그램은 알파벳 소문자 'a'부터 'z'까지 모든 문자를 최소 한 번씩 포함하는 문자열입니다. 입력의 끝은 '*'로 주어지며, 각 문자열이 팬그램인지 판별하고 결과를 출력합니다.


문제 해결 코드


#include <iostream>
#include <string>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    while (true) {
        string s;
        getline(cin, s);

        if (s == "*") break; // 종료 조건

        int arr[26] = {0}; // 알파벳 등장 여부를 저장하는 배열
        int cnt = 0;       // 고유 알파벳 개수

        for (char c : s) {
            if (c >= 'a' && c <= 'z') { // 소문자 알파벳만 체크
                if (arr[c - 'a'] == 0) {
                    arr[c - 'a'] = 1; // 알파벳 등장 표시
                    cnt++;
                }
            }
        }

        // 알파벳 개수 확인
        if (cnt == 26) {
            cout << "Y\n"; // 팬그램인 경우
        } else {
            cout << "N\n"; // 팬그램이 아닌 경우
        }
    }

    return 0;
}

코드 설명

코드의 주요 로직과 사용된 알고리즘 설명:

  • 핵심 알고리즘: 문자열을 순회하면서 각 알파벳의 등장 여부를 확인하고, 총 26개의 소문자가 등장했는지 판별합니다.
  • 구현 세부사항:
    • arr[26]: 알파벳 등장 여부를 저장하는 배열입니다.
    • 문자열의 각 문자 c가 소문자 범위('a' ~ 'z')에 해당하는지 검사한 후, 등장 여부를 체크합니다.
    • 입력의 끝 조건은 "*"입니다.
  • 시간 복잡도 분석:
    • 각 문자열의 길이를 n이라고 할 때, 문자열을 한 번 순회하므로 O(n)입니다.
    • 모든 입력을 처리하는 시간 복잡도는 O(n × T) (T는 입력 문자열 수)입니다.

결과

주어진 문자열이 팬그램인지 여부를 정확히 판별합니다.

  • 팬그램인 경우: "Y"
  • 팬그램이 아닌 경우: "N"

다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!

728x90
반응형
LIST