문자열 처리 실력을 기르는 데 가장 기본적이면서도 유용한 연습 문제 중 하나가 바로 주어진 문장에서 각 문자가 몇 번 등장하는지 세는 것입니다. 아래는 이를 Java로 구현한 전체 코드입니다.
예제
import java.util.*;
public class Demo{
static final int max_chars = 256;
static void char_occurence(String my_str){
int count[] = new int[max_chars];
int str_len = my_str.length();
for (int i = 0; i < str_len; i++)
count[my_str.charAt(i)]++;
char ch[] = new char[my_str.length()];
for (int i = 0; i < str_len; i++){
ch[i] = my_str.charAt(i);
int find = 0;
for (int j = 0; j <= i; j++){
if (my_str.charAt(i) == ch[j])
find++;
}
if (find == 1)
System.out.println("The number of occurrence of " + my_str.charAt(i) + " is :" +
count[my_str.charAt(i)]);
}
}
public static void main(String[] args){
Scanner my_scan = new Scanner(System.in);
String my_str = "This is a sample";
char_occurence(my_str);
}
}실행 결과
The number of occurrence of T is :1 The number of occurrence of h is :1 The number of occurrence of i is :2 The number of occurrence of s is :3 The number of occurrence of is :3 The number of occurrence of a is :2 The number of occurrence of m is :1 The number of occurrence of p is :1 The number of occurrence of l is :1 The number of occurrence of e is :1
코드 동작 원리
Demo라는 이름의 클래스 안에는 'char_occurence' 메서드가 정의되어 있으며, 이 메서드가 문자열 내 각 문자의 등장 횟수를 계산하는 핵심 역할을 담당합니다. 동작 과정은 다음과 같습니다.
- count 배열 선언: 크기가 256인 정수 배열을 생성하여 아스키(ASCII) 문자 각각의 등장 횟수를 저장할 공간을 마련합니다.
- 첫 번째 반복문: 문자열의 길이만큼 순회하면서 charAt() 메서드로 각 문자를 가져오고, 해당 문자의 아스키 코드 값을 인덱스로 사용해 count 배열의 값을 1씩 증가시킵니다.
- 두 번째 반복문: 현재 위치까지 같은 문자가 몇 번 나타났는지 내부 반복문으로 확인합니다. find 값이 1이라면 해당 문자가 처음 등장한 것이므로, 중복 출력 없이 한 번만 횟수를 화면에 보여줍니다.
main 메서드에서는 Scanner 객체를 생성해 콘솔 입력을 받을 준비를 하고, 분석할 문자열("This is a sample")에 대해 char_occurence 메서드를 호출합니다. 그러면 공백 문자를 포함한 모든 문자의 등장 횟수가 콘솔에 순서대로 출력됩니다.
참고로 이 알고리즘은 시간 복잡도가 O(n²)이므로 문자열이 매우 길어지면 HashMap을 사용하는 방식(O(n))이 더 효율적일 수 있습니다. 다만 학습 목적으로는 배열 기반 접근법이 문자와 인덱스의 관계를 이해하는 데 큰 도움이 됩니다.