알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
baaa
A
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
input = input.toLowerCase();
int[][] english = new int[26][2];
for(int i=0; i<26; i++) {
for(int j=0;j<2; j++) {
english[i][j]=0;
}
}
for(int i=0; i<input.length(); i++) {
english[input.charAt(i)-97][0]++;
english[input.charAt(i)-97][1] = Character.toUpperCase(input.charAt(i));
}
Arrays.sort(english, (o1, o2) -> {
return o1[0]-o2[0];
});
int max = english[25][0];
if (max==english[24][0]) {
System.out.print("?");
} else {
System.out.print((char)english[25][1]);
}
}
}
브론즈치고 이전 문자열 문제들과 비교했을 때 난이도가 조금 있는 편이었다. 그리고 이번에 자바에서 가장 약한 부분인 정렬이 있어서 조금 더 시간이 걸렸던 것 같다. 그렇기에 정렬부분을 간단하게 정리하고 끝내도록 하겠다.
Comparable과 Comparator는 객체의 비교를 위한 인터페이스.
객체는 사용자가 기준을 정해주지 않는 이상 어떤 객체가 더 높은 우선순위를 갖는지 판단할 수 없음.
public interface Comparator<T> {
int compare(T o1, T o2);
}
public interface Comparable<T> {
public int compareTo(T o);
}
Comparable 인터페이스는 compareTo(T o) 추상 메소드 하나만 존재.
자기 자신과 매개변수 객체를 비교.
Comparable보다 좀 더 복잡하게 정렬이 가능하며 필요할 때마다 구현해서 사용할 수 있는 인터페이스.
실질적으로 int compare(T o1, T o2)를 구현해야 함.
두 매개변수 객체를 비교. 자기 자신을 기준으로 상대방과의 차이 값을 비교하여 반환
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0] == o2[0]){
return o1[1] - o2[1];
}else{
return o1[0] - o2[0];
}
}
});
Arrays.sort(arr, (o1,o2) -> (o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]));