본문 바로가기
프로그래밍 기초/Java Festival

[Java Festival] 30. 알파벳 빈도수 구하기

by 제이투더문 2024. 7. 7.

 

 안녕하세요, 작가 J입니다. 이번에는 입력된 문장에 포함된 알파벳의 빈도를 대소문자 구별없이 구하는 프로그램을 작성해 보겠습니다. 이번 예제는 문자열 처리와 배열을 활용한 빈도수 계산을 배우는 데 도움이 됩니다.

 

[Java Festival 30] 알파벳 빈도수 구하기

입력된 문장에 포함된 알파벳의 빈도를

대소문자 구별없이 구하는 프로그램을 작성하시오.

 

 

 

코드 풀이 1: ASCII 숫자 접근에 따른 방식

import java.util.Scanner;

public class p45 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("==== 알파벳 빈도수 구하기 ====");
        System.out.print("입력 >> ");
        String str = sc.nextLine().trim().toLowerCase(); // 입력 문자열을 소문자로 변환
        char[] ch = str.toCharArray(); // 문자열을 문자 배열로 변환

        int[] array = new int[26]; // 알파벳 빈도수를 저장할 배열
        for (int j = 0; j < ch.length; j++) {
            for (int i = 97; i <= 122; i++) { // 'a'부터 'z'까지의 아스키 코드 범위
                if (ch[j] == i) { // 현재 문자가 알파벳인지 확인
                    array[i - 97] += 1; // 해당 알파벳의 빈도수 증가
                }
            }
        }
        for (int i = 97, j = 0; i <= 122; i++, j++) { // 'a'부터 'z'까지 출력
            System.out.println((char) (i) + " : " + array[j]);
        }
        sc.close(); // Scanner 객체 닫기
    }
}

 

1. 입력 받기 및 소문자 변환

  • String str = sc.nextLine().trim().toLowerCase();
  • 입력된 문자열을 소문자로 변환합니다.

2. 문자 배열로 변환

  • char[] ch = str.toCharArray();
  • 문자열을 문자 배열로 변환합니다.

3. 알파벳 빈도수 계산

  • int[] array = new int[26];
  • 알파벳 빈도수를 저장할 배열을 선언합니다.
  • for (int j = 0; j < ch.length; j++) { ... }
    • 문자 배열을 순회하면서 각 문자가 알파벳인지 확인하고 빈도수를 증가시킵니다.

4. 결과 출력

  • for (int i = 97, j = 0; i <= 122; i++, j++) { ... }
  • 'a'부터 'z'까지의 알파벳 빈도수를 출력합니다.

 

코드 풀이 2: 'char' 형만 사용한 방식

import java.util.Scanner;

public class Ex30Alternative {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("==== 알파벳 빈도수 구하기 ====");
        System.out.print("입력 >> ");
        String str = sc.nextLine().trim().toLowerCase(); // 입력 문자열을 소문자로 변환

        int[] frequency = new int[26]; // 알파벳 빈도수를 저장할 배열

        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c >= 'a' && c <= 'z') { // 알파벳 범위 확인
                frequency[c - 'a']++; // 해당 알파벳의 빈도수 증가
            }
        }

        for (char c = 'a'; c <= 'z'; c++) { // 'a'부터 'z'까지 출력
            System.out.println(c + " : " + frequency[c - 'a']);
        }
        
        sc.close(); // Scanner 객체 닫기
    }
}

 

 

1. 입력 받기 및 소문자 변환

  • String str = sc.nextLine().trim().toLowerCase();
  • 입력된 문자열을 소문자로 변환합니다.

2. 알파벳 빈도수 계산

  • int[] frequency = new int[26];
  • 알파벳 빈도수를 저장할 배열을 선언합니다.
  • for (int i = 0; i < str.length(); i++) { ... }
    • 문자열을 순회하면서 각 문자가 알파벳인지 확인하고 빈도수를 증가시킵니다.
    • if (c >= 'a' && c <= 'z') { ... }
      • 현재 문자가 알파벳 범위에 있는지 확인합니다.
    • frequency[c - 'a']++;
      • 해당 알파벳의 빈도수를 증가시킵니다.

3. 결과 출력

  • for (char c = 'a'; c <= 'z'; c++) { ... }
  • 'a'부터 'z'까지의 알파벳 빈도수를 출력합니다.

 

마무리

 

 이번 예제에서는 입력된 문장에 포함된 알파벳의 빈도를 대소문자 구별없이 구하는 두 가지 방식의 프로그램을 다뤄보았습니다. 첫 번째 방식은 기본적인 방식이며, 두 번째 방식은 char 형만을 사용한 방식입니다. 두 가지 방법 모두 이해하시는데 도움이 되길 바랍니다.

 

 프로그래밍을 시작하는 모든 분께 이 예제가 도움이 되길 바랍니다. 앞으로도 다양한 유형의 문제를 통해 여러분의 학습을 도울 수 있도록 노력하겠습니다. 감사합니다!