알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
Mississipi
zZa
?
Z
아스키코드로 ‘A’~’Z’는 65~90, ‘a’~’z’는 97~122이기 때문에, 여기에 ‘A’, 즉 65를 빼서 ‘A’~’Z’는 0~25, ‘a’~’z’는 32~57로 만듦.
그리고 여기서 소문자일 경우를 생각해 32로 나눈 나머지를 구한 후 인덱스로 사용하면 ‘A&a’ ~ ‘Z&z’ = 0~25가 됨.
그 후 최댓값을 찾고 최댓값의 인덱스도 함께 얻은 뒤, 최댓값을 제외한 다른 원소들과 비교하여 최댓값과 같은 원소가 있는지 찾음.
출력할 때는 ‘A’에 index를 더해서 해당 알파벳을 만들어 출력하고, 중복값이 있는 경우에는 ? 를 출력함.
#include <iostream>
using namespace std;
int main(void)
{
string word;
cin >> word;
int max = 0, index = 0, count[30] = {0};
// 알파벳 수 카운트 하기
for (int i = 0; i < word.length(); i++)
count[(word[i] - 'A') % 32] += 1;
// 최댓값 찾기
for (int j = 0; j < 26; j++)
{
if (count[j] > max) {
max = count[j];
index = j;
}
}
// 최댓값 중복 찾기
for (int j = 0; j < 26; j++)
{
if (j != index && count[j] == max) {
cout << "?\n";
return 0;
}
}
// 출력
cout << (char)('A' + index) << "\n";
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String word = br.readLine();
int max = 0, index = 0;
int[] count = new int[26]; // 알파벳 카운트
// 알파벳 수 카운트 하기
for (int i = 0; i < word.length(); i++)
count[(word.charAt(i) - 'A') % 32] += 1;
// 최댓값 찾기
for (int j = 0; j < 26; j++)
{
if (count[j] > max) {
max = count[j];
index = j;
}
}
// 최댓값 중복 찾기
for (int j = 0; j < 26; j++)
{
if (j != index && count[j] == max) {
System.out.println("?");
return;
}
}
// 출력
System.out.println((char)('A' + index));
}
}