컴굥일지

[BOJ/백준 11091][C++] 알파벳 전부 쓰기 본문

알고리즘/코테 문제

[BOJ/백준 11091][C++] 알파벳 전부 쓰기

gyong 2022. 1. 21. 22:34
반응형

문제

https://www.acmicpc.net/problem/11091

 

문제 내용

한 줄을 입력받아서 알파벳 a~z가 모두 최소 한 번씩 사용되었는지 확인하는 문제이다.

 

문제 풀이

먼저 알파벳 a~z가 들어있는 문자 배열을 선언해 두고 시작했다.

테스트 케이스별로 문제를 해결하기 위해 for문을 사용했다.
입력받는 문자열에 공백이 포함될 수 있기 때문에 getline()을 사용했다.

입력을 받고 나서는 tolower() 함수를 사용하여 문자열에 포함된 대문자를 소문자로 만들었다.
이후 find()함수를 통해 입력받은 문자열에 각각의 알파벳이 있는지 없는지를 확인했다.

find() 함수로 찾는 대상이 없다면 -1을 반환하기 때문에, 반환 값이 -1이면 해당 알파벳을 저장했다가 이후에 출력했다.

 

코드

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

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	char alphabet[26] = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

	int n;
	cin >> n;
	cin.ignore(); //입력 버퍼에 남아있는 모든 내용을 제거해준다.

	for (int j = 0; j < n; j++) {
		//입력
		string str;
		getline(cin, str); //문장 입력받기

		//문제 해결
		for (int i = 0; i < str.size(); i++) {
			str[i] = tolower(str[i]); //소문자로 변환
		}

		int pos;
		string result = ""; //알파벳이 문자열에 존재하지 않을 때 사용
		for (int i = 0; i < 26; i++) {
			pos = str.find(alphabet[i]);
			if (pos == -1) {
				result += alphabet[i];
			}
		}

		//결과 출력
		if (result.length() == 0) {
			cout << "pangram\n";
		}
		else {
			cout <<"missing "<< result << '\n';
		}
	}	
}

 

문제 코드 설명

1) 입력

cin으로 숫자를 입력받으면 입력버퍼에 \n이 남아있게 된다.
그렇기 때문에 cin.ignore()를 사용하여 입력 버퍼에 남아있는 내용을 지운다.

테스트 케이스별로 for문을 돌면서 문자열을 getline()으로 입력받는다.(공백이 존재할 수 있기 때문)

 

2) 문제 해결

tolower() 함수를 사용하여 문자열에 포함된 대문자를 소문자로 바꾼다.

반복문을 돌면서 find()함수를 통해 알파벳이 문자열에 포함되어있는지 아닌지를 확인한다.

 

3) 결과 출력

result변수에 아무것도 없으면 pangram을 출력한다.
아니라면 missing을 출력하고 문자열에 없던 알파벳을 정렬된 상태로 출력하면 된다.
(알파벳 존재유무를 확인할 때 사전 순으로 확인했기 때문에 따로 정렬이 필요하지 않는다.)

반응형
Comments