자바의 문법에 대해 헷갈리던 나는 살짝 헤맨 문제이다..!
시간초과가 2초에 단어의 길이는 1,000,000이기 때문에 2중 for문은 되겠다고 판단, 하지만 메모리 초과에 대해 간과했다.
처음의 풀이는 이렇다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
String str2;
int[] arr = new int[str.length()];
String[] sarr = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
for (int j = 0; j < str.length(); j++) {
if (str.charAt(i) > 97)
str2 = String.valueOf((char)(str.charAt(i) - 32));
else
str2 = String.valueOf(str.charAt(i));
if (sarr[j] == null || sarr[j].equals(str2)) {
arr[j]++;
sarr[j] = str2;
break;
}
}
}
int maxI = 0;
String maxS = "";
Boolean b = true;
for (int i = 0; i < arr.length; i++) {
if (sarr[i] != null && arr[i] == maxI)
b = false;
else if (sarr[i] != null && arr[i] > maxI) {
maxI = arr[i];
maxS = sarr[i];
}
}
System.out.println(b ? maxS : "?");
나의 풀이를 보면 매우 복잡한 로직을 볼 수 있다.
문법의 이해가 낮아 낮은 수준의 코드로 문제를 푸려니 이러한 코드를 만든 것 같다.
결국 다른 블로그의 풀이참고와 GPT의 문법 공부를 통해 만든 코드이다.
최종코드
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] arr = new int[26];
String s = br.readLine();
for (int i = 0; i < s.length(); i++) {
if ('a' <= s.charAt(i) && s.charAt(i) <= 'z')
arr[s.charAt(i) - 97]++;
else
arr[s.charAt(i) - 65]++;
}
int max = -1;
char ch = '?';
for (int i = 0; i < 26; i++) {
if (arr[i] > max) {
max = arr[i];
ch = (char) (i + 65);
} else if (arr[i] == max)
ch = '?';
}
System.out.println(ch);
}
}
코드가 매우 간결해지고 모듈화가 된 것을 볼 수 있다. 또한, 나는 이중 for문으로 푼 문제를 다중 for문으로 푼 것이 매우 인상적이었다.
배운 점
코드를 즉흥적으로 짜다 보니 디버그의 시간이 오래 걸렸다. 또한 이를 통해 자바 문법에 대해 더 잘 알게 된 것 같다.
앞으로는 메모리 초과도 염두에 둬야겠다!!
'코딩테스트 > 백준' 카테고리의 다른 글
[백준 JAVA] 2738 - 행렬 덧셈 (0) | 2024.11.27 |
---|---|
[백준 JAVA] 25206 - 너의 평점은 (0) | 2024.11.26 |
[백준 JAVA] 1316 - 그룹 단어 체커 (0) | 2024.11.25 |
[백준 JAVA] 2941 - 크로아티아 알파벳 (0) | 2024.11.25 |
[백준 JAVA] 2444 - 별 찍기 - 7 (0) | 2024.11.25 |