import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String st = sc.next();
st = st.toUpperCase();
int[] arr = new int[91];
for (int i = 0; i < st.length(); i++) {
arr[(int) st.charAt(i)]++;
}
int max = 0;
int idx = 0;
for (int i = 65; i <= 90; i++) {
if (arr[i] > max) {
max = arr[i];
idx = i;
}
}
int cnt = 0;
for(int i=65; i<=90; i++) {
if(max == arr[i]) cnt ++;
}
if(cnt == 1) System.out.println((char)idx);
else System.out.println("?");
}
}
문제를 처음 봤을 때 문자열의 처음부터 끝까지 계속 반복하면서 각 문자가 몇개 나오는지 count 하고, 그 중에 가장 많이 count 된 문자를 출력하면 되는 간단한 문제입니다. 하지만 이렇게 for 문 2개로 풀게 되면 주어지는 단어의 최대 길이가 1,000,000 라서 시간 초과가 나오게 됩니다.
그래서 저는 반복문을 한번사용해서 어떻게 풀지 생각해 보았습니다. 주어지는 문자열이 모두 알파벳이고, 대문자 소문자는 구분안한다고 했기 때문에 처음에 문자열을 소문자나 대문자로 모두 바꾸고, 처음부터 끝까지 돌면서 각 문자의 아스키코드 값에 해당하는 int 배열을 카운트 해주고 가장 큰 값을 출력하면 되는 문제였습니다.
[ 문제 풀이 ]
1. 저는 주어진 문자열을 처음에 대문자로 바꿨습니다. 이유는 마지막에 가장 많이 나온 문자를 출력할 때 대문자로 출력하기 때문입니다. 소문자로 바꾸고 마지막에 대문자로 바꿔주어도 상관없습니다.
2. 그리고 arr 이라는 int 배열을 만들고 알파벳 대문자의 아스키 코드값이 65부터 90까지이기 때문에 나오는 문자에 해당하는 아스키코드값을 1씩 증가시켜 줍니다.
3. 그리고 최댓값과 최댓값에 해당하는 인덱스를 저장합니다. 그런데 최댓값이 여러개 나오면 "?"을 출력하라고 문제에 조건이 있습니다.
4. 여러개 나오는지는 반복문을 한번 더 돌면서 cnt 변수에 가장 큰 값이 몇번 나오는지 체크하고, 1이라면 아스키 코드값에 해당하는 문자를 출력하고, 아니라면 여러번 나온것이기 때문에 "?"을 출력합니다.
'알고리즘 > 문제풀이' 카테고리의 다른 글
[1389] 케빈 베이컨의 6단계 법칙 (0) | 2019.09.21 |
---|---|
[9251] LCS (0) | 2019.09.21 |
[1476] 날짜 계산 (0) | 2019.07.13 |
[14426] 이모티콘 (1) | 2019.04.20 |
[17142] 연구소 2 (0) | 2019.04.18 |