본문 바로가기
코딩공부/백준 (java)

[백준 1157] 단어 공부 (java)

by CodingKwon 2021. 7. 15.

문제 링크

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

 

1157번: 단어 공부

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

www.acmicpc.net

 

나의 코드 (java)

import java.util.Scanner;

public class Main {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);

        // 입력 받기
        String s = sc.next();
        // 계산을 편하게 하기 위해 받은 문자열을 소문자로 변경
        s = s.toLowerCase();

        // 알파벳의 개수를 담을 배열 (알파벳은 26개)
        int arr[] = new int[26];
        // 가장 많이 사용된 알파벳의 횟수를 담을 변수
        int max = -1;
        // 가장 많이 사용된 알파벳을 담을 변수
        char ch = '?';

        // 문자열의 길이만큼 반복문을 돌음
        for (int i=0; i<s.length(); i++){
            // 사용된 알파벳의 카운트를 1 올림
            arr[s.charAt(i)-'a']++;
        }

        // 문자열의 길이만큼 반복문을 돌음
        for (int j=0; j<26; j++){
            // 가장 많은 횟수를 가진 알파벳을 찾는다면
            if (arr[j] > max){
                // 최댓값을 바꾼다.
                max = arr[j];
                // 해당 알파벳을 변수에 담아둔다.
                ch = (char) (j + 'A');
            // 같은 최대 횟수를 지닌 알파벳을 찾는다면
            } else if (arr[j] == max){
                // '?'을 변수에 담아둔다.
                ch = '?';
            }
        }
        // 결과 출력
        System.out.println(ch);

    }
}

 

이 문제는 문자열에서 가장 많이 사용된 알파벳을 대문자로 출력하는 것입니다.

하지만 여기서 가장 많이 사용된 알파벳이 한 개가 아니라면? (Mississipi의 경우 s가 4개 i가 4개입니다.) '?'을 출력하게 됩니다.

 

문제를 쉽게 접근하기 위해서는 문자열을 toLowerCase()를 사용하여 소문자로 모두 바꾸어 접근하는 것이 편합니다.

이후에 첫 번째 반복문(for)에서 알파벳의 사용 횟수를 카운팅하고 다음 반복문(for)에서 가장 많이 사용된 알파벳을 검증합니다.

여기서 주의해야할 점은 만약 배열 1번 인덱스(즉, 알파벳 b)가 많이 사용되었다면 이를 ch라는 char 변수에 담아주는데 이때 숫자가 아닌 char로 형변환을 시켜주어야 합니다. 또한, 결과 출력은 대문자로 출력해야 하기 때문에 'A'를 더해주어야 합니다.

댓글