반응형
https://www.acmicpc.net/problem/11091
문제
팬그램은 26개의 알파벳, a~z를 최소 한 번씩 모두 사용한 문장을 말한다. 아마 가장 유명한 문장은 이것일 것이다. "The quick brown fox jumps over the lazy dog."
꿈은 다른 문장들 중에 팬그램인 것은 없는지 궁금해졌다. 그래서 여러분이 할 일은 꿈을 위해 어떠한 문장이 팬그램인지 아닌지를 판별해주는 프로그램을 짜는 것이다.
팬그램에서는 알파벳의 대소문자를 구분하지 않는다고 하자.
입력
입력의 첫 번째 줄은 1 ≤ N ≤ 50의 N이 주어진다.
다음 N개의 줄은 각각 한 문장이 주어지는데, 알파벳의 대소문자, 공백, 숫자, 그리고 분장 부호들(. ,?! ' ")이 포함될 수 있다.
각 문장은 최소 한개의 문자를 포함하며 100개를 넘지는 않는다.
출력
각 입력에 대해, 팬그램에 해당하면 "pangram"을 출력한다.
만약 팬그램이 아닐 경우, "missing"을 출력한 후 한 칸 띄고 문장에 나타나지 않은 문자들을 모두 출력한다. 이때, 나타나지 않은 문자들은 모두 소문자로 출력하며 알파벳 순서대로 정렬된 상태로 출력해야 한다.
예제 입력 1 복사
3
The quick brown fox jumps over the lazy dog.
ZYXW, vu TSR Ponm lkj ihgfd CBA.
.,?!'" 92384 abcde FGHIJ
예제 출력 1 복사
pangram
missing eq
missing klmnopqrstuvwxyz
풀이
1. 입력받은 문자열을 모두 소문자로 바꾼다. --- transform
2. 문자열길이만큼 for문으로 돌려 각 문자-97를 해준 뒤, 배열에 넣는다.
코드
#include <iostream>
#include <string>
#include <algorithm> // transform
using namespace std;
int main() {
int test;
cin>>test;
cin.ignore();
for(int i=0; i<test; i++){
string str;
getline(cin, str);
// 문자열을 모두 소문자로 변환
transform(str.begin(), str.end(), str.begin(), ::towlower);
int arr[26]={0};
int cnt=0;
int len = str.length();
for(int i=0; i<len; i++){
cnt=str[i]-97; // 아스키코드 a=97~z=122
arr[cnt]++;
}
int cnt1=0;
for(int i=0; i<26; i++){
if(arr[i]!=0){ // 각 배열에 쓴문자가 있으면
cnt1++; // 카운트
}
}
if(cnt1==26){ // 문자를 모두 썼으면,
cout<<"pangram\n";
}
else{
cout<<"missing ";
for(int i=0; i<26; i++){
if(arr[i]==0){
cout<<char(i+97); // 다시 문자형으로 바꿔준다.
}
}
cout<<"\n";
}
}
return 0;
}
|
cs |
이 문제를 풀면서 알게 된게 transform이라는 함수를 알면 엄청 편하다는 것을 느꼈다.
반응형
'백준 > C++' 카테고리의 다른 글
[BaeKJoon/C++] 백준 1259 c++ 팰린드롬수 (0) | 2022.02.09 |
---|---|
[BaeKJoon/C++] 백준 5671 c++ 호텔 방 번호 (0) | 2022.02.08 |
[BaeKJoon/C++] 백준 10867 c++ 중복 빼고 정렬하기 (0) | 2022.02.06 |
[BaeKJoon/C++] 백준 2495 c++ 연속 구간 (0) | 2022.02.06 |
[BaeKJoon/C++] 백준 5656 c++ 비교 연산자 (0) | 2022.02.05 |