코딩테스트/백준

[백준 JAVA] 1157 - 단어공부

kittae 2024. 11. 25. 11:34

 

자바의 문법에 대해 헷갈리던 나는 살짝 헤맨 문제이다..!
시간초과가 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문으로 푼 것이 매우 인상적이었다.

 

결과는 이렇다!

 

배운 점

코드를 즉흥적으로 짜다 보니 디버그의 시간이 오래 걸렸다. 또한 이를 통해 자바 문법에 대해 더 잘 알게 된 것 같다.

앞으로는 메모리 초과도 염두에 둬야겠다!!