[백준 BOJ] 5704번 팬그램 (C++/cpp)

2024. 2. 10. 16:39PS (Program Solving)/BOJ (백준)

문제 설명

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

 

5704번: 팬그램

입력은 여러 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 많아야 200글자로 이루어져 있는 문장이다. 단어는 공백 하나로 구분되어 있다. 또, 단어는 알파벳 소문자로만 이루어져 있다.

www.acmicpc.net

백준 BOJ 5704번 팬그램 문제 사진

 

접근 방법 - 알파벳 빈도수 측정을 이용한 연산 문제

백준의 5704번 문제는 알파벳 빈도수를 측정하는 기법을 활용하면서 해결해야 하는 문제이다.

해당 문제는, 입력으로 주어지는 각 문장이 팬그램인지를 판단하며 정답을 출력해야 하는 문제이다.

이때 팬그램이란 문제에 제시되어 있는 대로 모든 알파벳을 사용하여 만들어낸 문장을 의미한다.

필자의 경우에는 각 알파벳의 출현 빈도를 저장하는 배열을 생성하고 연산한 뒤, 모든 배열값이 1 이상인 경우에 대해서 팬그램이라 판단하게끔 코드를 구성하였다.

이렇게 알파벳 빈도수 측정 연산을 여러 번 해보았다면, 이 문제는 비교적 쉽게 해결하였을 것으로 예상된다.

혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면, 아래의 설명과 코드를 참고해 보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 무한 반복문을 실행하여, 아래의 연산을 취한다.

  • 문장(st)을 하나씩 입력받는다. (이때 *을 입력받은 경우에는 실행 종료해야 하기 때문에, break를 수행한다.)
  • 각 알파벳 출현 횟수를 저장할 배열 alpha를 선언하고, 모든 배열값을 0으로 초기화한다.
  • 문장의 각 문자들을 탐색하면서, 해당하는 문자에 1:1 대응되는 alpha 배열값에 1씩 더하도록 한다. (소문자만 주어진다는 점을 유의하도록 한다. a~z의 빈도수는 각각 alpha[0] ~ alpha[25]에 저장되도록 하였다.)
  • 문자들을 모두 탐색하였다면, 문장에 존재하지 않는 알파벳이 있는지 탐색하기 위해 no 변수를 0으로 초기화하여 선언한다.
  • alpha 배열값들을 순차적으로 탐색한다. 이때, 0인 값을 찾게 되면 해당 알파벳은 문장에 존재하지 않는다는 의미이기 때문에 no에 1을 더하도록 한다.
  • no 값이 0이라면 모든 알파벳이 문장에 등장하였다는 것을 의미하기 때문에 "Y"를 출력, 0이 아니라면 빠진 알파벳이 하나라도 있다는 것을 의미하기 때문에 "N"를 출력하도록 한다.

 

2) 1)의 연산이 종료되었다면, 실행을 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <string>
#define endl '\n'
using namespace std;

//백준 5704번 코드
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);   cout.tie(NULL);
	
	while (1) {
		string st;
		getline(cin, st);
		if (st == "*") { break; }

		int alpha[26] = { 0 };
		for (int i = 0; i < st.length(); i++) {
			alpha[st[i] - 'a']++;
		}

		int no = 0;
		for (int i = 0; i < 26; i++) {
			if (alpha[i] == 0) { no++; }
		}

		if (no == 0) { cout << "Y" << endl; }
		else { cout << "N" << endl; }
	}
}

 

제출 결과

백준 BOJ 5704번 팬그램 문제 C++ 제출 결과

(2023.08.17 백준 5704번 문제 제출 결과)

반응형