본문 바로가기

알고리즘/문자열

[자바]백준 1157번 단어 공부 [문자열][엄탱]

728x90

안녕하세요. 개발자 엄탱입니다.
이 글은 알고리즘을 공부하면서 공부 기록용입니다.
그래서 설명마다 일기용으로 편하게 작성하여 반말 형식으로 작성하려고 합니다.
그리고 보시다가 더 좋은 방법이나 잘 못 알고 있는 내용이 있다면 알려주시면 정말 감사하겠습니다.
좋은 하루 되세요 :)

문제 링크

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

문제 설명

주어진 영어 단어 중에 대소문자 구분 없이 가장 많이 사용된 알파벳을 출력하면 된다.

단, 최댓값이 중복되면 '?'를 출력 하면 된다.

해설

해당 문제는 알파벳을 숫자로 변환하는게 핵심이다.

배열을 하나 만들고 알파벳을 숫자로 변환하여 해당 숫자의 인덱스에 해당하는 값을 +1씩 증가시켜서 단어의 알파벳의 개수들을 기록해 준다.

그 후에 최대 개수를 파악해주고 개수가 중복되면 '?'를 출력하고 아니면 해당 인덱스를 다시 알파벳으로 변환하여 출력하면 된다.

코드

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

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

        String s = br.readLine().toUpperCase();
        
        int[] counts = new int['Z' - 'A' + 1];

        for (int i = 0; i < s.length(); i++) {
            counts[s.charAt(i) - 'A']++;
        }

        int max = 0;
        char answer = '?';

        for (int i = 0; i < counts.length; i++) {
            if (max < counts[i]) {
                max = counts[i];
                answer = (char) ('A' + i);
            } else if (max == counts[i]) {
                answer = '?';
            }
        }

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

코드 설명

  1. 우선 대소문자 구분이 없으니 대문자 혹은 소문자로 치환해 준다. 대문자든 소문자든 상관없다.
  2. 배열의 길이를 A, B, C... Z의 총개수만큼 만들어준다.

그 외에는 코드를 보면서 이해하면 될 것 같다.

728x90