티끌모아 태산

1157: 단어 공부 본문

백준 문제/문자열,누적합,구현

1157: 단어 공부

goldpig 2024. 3. 26. 12:21
728x90

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

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

설명

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

핵심 아이디어

  • 주어진 문자의 알파벳 빈도수를 0~25 공간에 저장한다. 즉 카운팅 배열! -> ord(), char(), lower(), upper()
  • 마지막으로 해당 알파벳이 유일한 최다 빈도수인지 확인한 후 결과를 출력한다. 

코드 구현

Python 

s = input().lower() # 대소문자 구분 X, 출력만 대문자로!
# 우선 각 문자를 중복 없이 따로 추출
s_list = list(set(s))
# print(s_list) ['a', 'z']
# 각 문자의 빈도를 담을 배열
cnt = []
for i in s_list:
	num = s.count(i)
	cnt.append(num)
# print(cnt) [1, 2]
# 그리고 이제 최단 빈도수인지 확인
if cnt.count(max(cnt)) > 1:
	print("?")
else:
	print(s_list[cnt.index(max(cnt))].upper())

C++ 

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

// 문제의 핵심은 카운팅 배열 사용
	
string s;
int counting_arr[26], cnt = 0;
// 아스키코드: 대문자 65~90 소문자 97~122
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	// 문자 입력받기
	cin >> s;

	// 빈도수 체킹
	for (int i = 0; i < s.length(); i++) {
		if (s[i] < 97) {
			counting_arr[s[i] - 65]++; // 대문자
		}
		else {
			counting_arr[s[i] - 97]++; // 소문자
		}
	}
	int max = 0, max_index = 0;

	for (int i = 0; i < 26; i++) {
		if (max < counting_arr[i]) {
			max = counting_arr[i];
			max_index = i;
		}
	}
	// 가장 많이 사용된 알파벳이 여러개인가?
	for (int i = 0; i < 26; i++) {
		if (max == counting_arr[i]) cnt++;
	}
	// 여러개라면 ? 
	if (cnt > 1) cout << "?";
	else cout << (char)(max_index + 65); // 대문자 출력
}
728x90