1157
단어 공부
- 알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다. (중복시 '?'반환)
- 단어의 길이는 1,000,000을 넘지 않는다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class bj1157_0126 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 입력과 동시에 대문자화
String str1 = br.readLine().toUpperCase();
// 길이 구하는 함수 여러번 호출하지 말고 그냥 변수에 넣기
final int len = str1.length();
// 각 인덱스에 대응하는 알파벳 개수 기록 배열
int[] arr = new int[len];
// 기록 시작
for (int i = 0; i < len; i++) {
if (arr[i] == -1) // 건너뛰라고 적어놓은 -1이 맞다면 건너뛰기
continue;
arr[i]++; // 하나 카운트
for (int j = i + 1; j < len; j++) {
// 그 다음 번부터 끝까지, 일치할때마다 +1
if (str1.charAt(j) == str1.charAt(i)) {
arr[i]++;
arr[j] = -1; // 대신 일치한 대상은 -1로 건너뛰어주기
}
}
}
// 최대값 찾기
int max = 0;
int maxIdx = 0;
for (int i = 0; i < len; i++) {
if (arr[i] > max) {
maxIdx = i; // 최대값이 발생한 인덱스
max = arr[i]; // 최대값
}
}
int check = 0; // 최대값 중복 확인
for (int i = 0; i < len; i++) {
if (arr[i] == max) {
check++;
if (check == 2) // 이미 2개면 더 볼 것 없다.
break;
}
}
if (check == 1)
System.out.println(str1.charAt(maxIdx));
else
System.out.println("?");
}
}
- 어렵다.
- 일단... 분명 메모리초과 시간초과를 이겨야 하는 문제인 것 같고... 그래서 빠른입출력을 썼고.
- 마지막에 100%까지 갔다가 계속 틀렸습니다 뜨길래 뭐가문제지 하고 계속 들여다봤더니...
- 하나만 입력했을 때 그 문자를 그대로 반환할 수 없는 코드였다. 그래서 수정해서 냈더니 됐다.
- 이 문제도... java로 해서 어려운 것 같다. 다른 언어로 하면 더 쉬울 것 같다.
'PS - BOJ' 카테고리의 다른 글
1292, 1316, 1357 - 쉽게 푸는 문제, 그룹 단어 체커, 뒤집힌 덧셈 (0) | 2022.01.30 |
---|---|
1193 - 분수찾기, 1225 - 이상한 곱셈, 1233 - 주사위 (0) | 2022.01.28 |
1100, 1110, 1159 - 하얀 칸, 더하기 사이클, 농구 경기 (0) | 2022.01.27 |
1026, 1037, 1085 - 보물, 약수, 직사각형에서 탈출 (0) | 2022.01.26 |
1003 - 피보나치 함수 (0) | 2022.01.25 |