문제
팬그램(pangram)이란 알파벳 26자를 모두 포함하는 문장이다. 주어진 문자열이 팬그램인지 판별하여 Y 또는 N을 출력하는 문제다. *이 입력되면 종료한다.
입력
- 한 줄씩 문자열이 주어진다.
*이 입력되면 종료한다.
출력
- 각 줄에 대해 팬그램이면
Y, 아니면N을 출력한다.
예제
| 입력 | 출력 |
|---|---|
The quick brown fox jumps over the lazy dog | Y |
Hello World | N |
* | (종료) |
풀이
26비트 비트셋으로 알파벳 등장 여부를 추적하고, 모두 1이면 팬그램으로 판별한다.
getline으로 한 줄씩 읽고,*이면 루프 종료bitset<26> seen을 선언하여 초기화- 문자열 각 문자에 대해 알파벳이면
seen[c - 'a'] = 1설정 seen.all()이true이면Y, 아니면N출력
핵심 아이디어: bitset<26>을 사용하면 26개 알파벳의 등장 여부를 1비트씩 관리하고, .all()로 전체 등장 여부를 O(1)에 확인할 수 있다.
코드
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s;
while (getline(cin, s) && s != "*")
{
bitset<26> seen;
for (char c : s)
if (isalpha(c))
seen[c - 'a'] = 1;
cout << (seen.all() ? "Y" : "N") << "\n";
}
return 0;
}복잡도
- 시간: O(N) — 문자열 길이 N에 비례하여 순회
- 공간: O(1) —
bitset<26>고정 크기 사용