코딩 테스트

[코딩테스트] 백준 1157번: 단어 공부

dev.jelee 2025. 6. 18. 16:58

# 문제

 

# 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BOJ1157_v1 {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String input = br.readLine().toUpperCase(); // 대문자로 변환
    int[] count = new int['z' - 'a' + 1]; // 알파벳 개수만큼 선언. 전체 0으로 초기화.
    int max = -1; // 최대값 구하기 위한 변수
    char result = ' ';

    // 각 알파벳 등장 횟수 세기
    for (int i = 0; i < input.length(); i++) {
      char c = input.charAt(i);

      count[c - 'A']++; // 해당 알파벳 자리의 count++ 해주기
    }

    // 가장 많이 등장한 알파벳 찾기
    for (int i = 0; i < count.length; i++) {
      if (count[i] > max) {
        max = count[i]; // 가장 큰 수 저장
        result = (char) (i + 'A'); // 알파벳 아스키코드 구하기
      } else if (count[i] == max) {
        result = '?';
      }
    }

    System.out.println(result);
    br.close();
  }
}

 

# 입/출력 결과

 

# 과정

  1. 입력은 BufferedReader 클래스 사용
  2. String input에 입력받은 값을 대문자로 변환하여 저장
  3. int[] count를 알파벳 개수만큼 생성
  4. int max를 -1로 생성 -> a-z 알파벳 기본 0으로 세팅할 것이기 때문에 비교하기 위해서는 -1로 해야함
  5. char result 빈 문자로 생성
  6. for문 사용하여 알파벳 등장 횟수 세기
    • : input.length() 만큼 반복
    • : 알파벳 개수 크기로 생성한 count에 input의 알파벳 자리를 찾아서 count++ 해주기
  7. for문 사용하여 많이 등장한 알파벳 찾기
    • : count.length 만큼 반복
    • : if문 사용하여 count[i]가 max보다 크면 max에 count[i] 저장하고 result에 count[i]의 자리의 알파벳을 구해야하는데 아스키코드를 활용하여 구하기
    • : 구하는 방법은 i + 'A' A의 아스키코드 값에 i를 더해주면 됨
    • : count[i]와 max의 값이 동일하면 result에 ? 저장
  8. result 출력

 

# 메모

  • 내가 처음에 작성한 코드는 apple을 입력 받으면 대문자로 변환 시킨 다음에 각 알파벳을 추출하여 ArrayList에 저장하는데 중복되는 알파벳은 제외하고 저장하였다. 그 다음에 ArrayList에 apple 한 글자씩 .contains() 하여 있으면 count를 세는 방식으로 했는데, 메모리초과하여 실패했다.
  • 어떻게 줄일 수 있을지 고민을 해보았는데, 답을 찾지 못하여서 chat-gpt한테 나의 코드를 보여주면서 개선해 달라고 요청했다. 요청받은 결과는 본 포스팅에 작성한 코드이다. 코드를 보고 이해는 하지만 아스키코드를 활용한다는 점이 익숙하지 않아서 이해하는 속도가 더디었다. 윽...

▼ 내가 작성하고 메모리 초과로 실패한 코드. 불필요한 코드가 많았다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class BOJ1157_v2 {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String input = br.readLine().toUpperCase(); // 대문자로 변환
    ArrayList<String> inputArr = new ArrayList<>();

    // 알파벳 추출 (중복x)
    for (int i = 0; i < input.length(); i++) {
      String c = String.valueOf(input.charAt(i));
      
      if (inputArr.contains(c)) {
        continue;
      } else {
        inputArr.add(c);
      }
    }

    // count inputArr 크기 만큼 생성 후 모두 0으로 초기화
    int[] count = new int[inputArr.size()];

    // 중복 알파벳 count 세기
    for (int i = 0; i < inputArr.size(); i++) {
      
      for (int j = 0; j < input.length(); j++) {
        String c = String.valueOf(input.charAt(j));
        if (inputArr.get(i).equals(c)) {
          count[i] += 1;
        }
      }
    }

    // 결과 구하기
    int max = 0;
    String result = "";
    for (int i = 0; i < inputArr.size(); i++) {
      if (count[i] > max) {
        max = count[i];
        result = inputArr.get(i);
      } else if (count[i] == max) {
        result = "?";
      }
    }

    System.out.println(result);
    br.close();
  }
}