https://www.acmicpc.net/problem/1157
[ 문제 ]
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오.
단, 대문자와 소문자를 구분하지 않는다.
[ 입력 ]
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다.
주어지는 단어의 길이는 1,000,000을 넘지 않는다.
[ 출력 ]
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다.
단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
[ 입출력 예시 ]
예제 입력 | 예제 출력 |
---|---|
Mississipi | ? |
zZa | Z |
z | Z |
- 입력 받은 문자열을 문자열.toUpperCase()를 이용하여 대문자로 변경해주고
(문자를 검사했을 때 소문자와 대문자를 구분하면 아스키 코드를 값을 구분해서 빼주어야하므로 하나로 통일.)
문자열.toCharArray();를 이용하여 문자 배열(input)에 문자 하나씩 배열에 저장해준다.
- 알파벳의 개수를 세어줄 정수형 배열(Alphabet)을 알파벳 A~Z의 개수만큼 선언.
- 배열에 존재하는 문자를 하나씩 확인하며
해당 문자에 - 'A'(A의 아스키코드 값(65))을 빼주면 몇 번째 문자(알파벳)가 있는지 알 수 있으며
그에 해당하는 인덱스 값을 증가(++)시키며 단어들의 개수를 세어준다.
- 증가 시킬 때, 개수의 최대값(max)보다 크다면 해당 문자의 개수로 max값을 변경하여주고, 인덱스를 해당 문자 인덱스로 지정해준다.
- 다시 알파벳 개수를 나타내는 배열(Alphabet)을 확인하면서 가장 많았던 본인 인덱스가 아니고, 최댓값이 같은 배열이 있으면 똑같은 개수의 알파벳이 있는 것이므로 "?"를 출력하고 종료한다.
- 그렇지 않다면 가장 많이 있는 알파벳을 출력해준다. (n번 째 인덱스 + 'A'(65))
알파벳(아스키코드 값) | A(65) | B(66) | C(67) | D(68) | ... | Z(90) |
---|---|---|---|---|---|---|
순서 | 0 | 1 | 2 | 3 | ... | 26 |
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));
char[] input = br.readLine().toUpperCase().toCharArray();
int[] Alphabet = new int[26];
int max = 0;
int index = 0;
for(int i=0; i<input.length; i++) {
Alphabet[input[i]-65]++;
if(Alphabet[input[i]-65] > max) {
max = Alphabet[input[i]-65];
index = input[i]-65;
}
}
for(int i=0; i<Alphabet.length; i++) {
if(i != index && Alphabet[i] == max) {
System.out.println("?");
System.exit(0);
}
}
System.out.println((char)(index+65));
}
}