승코딩당당당

[C++] 백준 1157: 단어 공부 본문

PS/BOJ

[C++] 백준 1157: 단어 공부

승코딩당당당 2025. 12. 29. 14:22

문제

[C++] 백준 1157: 단어 공부 BRONZE 1
https://www.acmicpc.net/problem/1157

 


 

접근 방법

이 문제는 단어가 주어졌을 때 가장 많이 사용된 알파벳을 출력하는 문제이다.

대소문자는 구분하지 않으므로 먼저 모든 문자를 대문자로 통일한다.

 

각 문자를 하나씩 확인하면서,
해당 문자의 아스키 코드 값을 인덱스로 사용해 배열에 등장 횟수를 저장한다.

  • 문자 'A', 'B', 'C' … 는 내부적으로 각각 고유한 아스키 코드 값을 가지므로
  • 문자 자체를 int로 변환해 배열의 인덱스로 사용하면 알파벳별 등장 횟수를 쉽게 관리할 수 있다.

 

이후 배열을 순회하며 가장 큰 빈도를 가진 인덱스를 찾고,
해당 빈도가 유일한지 여부를 확인한다.

  • 최댓값이 하나뿐이면 → 해당 인덱스를 다시 문자로 변환해 출력
  • 최댓값이 여러 개면 → ? 출력

 

구현 시 주의할 점

  • 대소문자를 구분하지 않으므로 toupper()를 사용해 모든 문자를 대문자로 변환한 뒤 처리해야 한다.
  • (소문자 변환은 tolower())

 


 

코드

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

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

	string word = "";
	cin >> word;

	int arr[100] = { 0, };
	for (int i = 0; i < word.size(); i++)
	{
		word[i] = toupper(word[i]);  // 모든 문자 대문자로 변경

		arr[(int)word[i]]++;
	}
	int Max = -1, index = 0;
	for (int i = 0; i < 100; i++)
	{
		if (arr[i] > Max)
		{
			Max = arr[i];
			index = i;
		}
	}
	bool flag = false;  // 가장 많이 사용된 알파벳이 여러 개인 경우
	for (int i = index + 1; i < 100; i++)
	{
		if (arr[i] == Max)
		{
			flag = true;
			break;
		}
	}
	
	if (flag == true)
		cout << '?';
	else
		cout << (char)index;

	return 0;
}

'PS > BOJ' 카테고리의 다른 글

[C++] 백준 11723: 집합  (1) 2025.12.30
[C++] 백준 2816: 디지털 티비  (1) 2025.12.29
[C++] 백준 1927: 최소 힙  (0) 2025.12.29
[C++] 백준 2292: 벌집  (2) 2025.12.29
[C++] 백준 5073: 삼각형과 세 변  (0) 2025.12.28