문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
풀이
i) String을 입력받는다.
ii) a부터 z까지의 갯수를 저장하기 위한 int [] 을 만든다.
iii) 소문자와 대문자를 가리지 않고 A,a 는 0번째 Z,z는 25번째 int[]에 갯수를 추가해 준다.
iiii) 갯수가 가장 많은 알파벳을 꺼낸다. 갯수가 가장많은 알파벳이 2개이상인 경우 중복이다.
iiiii) 중복이면 ?를 출력 아니면 대문자 알파벳을 출력한다
* 주의할 점은 알파벳의 아스키코드 값이다. a는 97, A는 65이다.
public class Main{
public static void main(String args[])throws IOException{
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
String str=br.readLine();
int[] store=new int[26];
//abcde fghij klmno pqrst uvwxy z
//모두 0으로 초기화
for(int i=0;i<26;i++){
store[i]=0;
}
for(char cha : str.toCharArray()){
// 대문자인 경우
if(Character.isUpperCase(cha)){
store[cha-'A']++;
}
//소문자인 경우
else{
store[cha-'a']++;
}
}
int big=0;
int bignum=0;
int dup=0;
for(int i=0;i<26;i++){
if(store[i]>big){
big=store[i];
bignum=i;
dup=0;
}
else if(store[i]==big){
dup=1;
}
}
if(dup==0){
System.out.println((char)('A'+bignum));
}
else{
System.out.println("?");
}
}
}
피드백
1. 처음에 알파벳 A의 아스키 코드값이 알파벳 z의 아스키코드 값 다음이라고 무턱대고 생각하고 'A'-'a'-26를 하여서 배열에 넣었다. 하지만 indexoutofBound 오류가 났고 찾아보니 'A'의 아스키 코드 값이 더 작은걸 알게 돼었다.
-> 대문자인 경우 그냥 'A'를 빼서 넣어주는게 훨씬 편했다.