Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java로 두 문자열이 아나그램(Anagram)인지 확인하는 방법

이 글에서는 두 문자열이 아나그램(Anagram)인지 확인하는 Java 프로그램을 작성하는 방법을 알아봅니다.

아나그램이란 한 단어나 구문의 글자 순서를 재배열하여 만든 다른 단어를 의미합니다. 예를 들어 'Race'와 'Care'는 동일한 글자들로 구성되어 있으므로 서로 아나그램 관계입니다.

사용자가 두 개의 문자열을 입력하면, 각 문자('a'부터 'z')가 등장하는 횟수, 즉 빈도(frequency)를 세어 두 문자열의 빈도를 비교합니다. 특정 알파벳의 빈도란 해당 문자가 문자열 안에 몇 번 나타나는지를 뜻하며, 두 문자열의 모든 알파벳 빈도가 동일하다면 그 두 문자열은 아나그램이라고 할 수 있습니다.

입력 및 출력 예시

입력

Enter the first string : Race
Enter the second string : Care

출력

The strings race and care are anagram.

알고리즘

두 문자열이 아나그램인지 확인하는 절차는 다음과 같습니다.

  1. 시작 — 프로그램을 실행합니다.
  2. 두 개의 문자열 변수(my_string_1, my_string_2)를 선언합니다.
  3. 사용자로부터 값을 입력받거나 값을 직접 정의합니다.
  4. toLowerCase() 함수를 사용해 두 문자열을 모두 소문자로 변환합니다.
  5. 두 문자열의 길이가 같은지 확인합니다. 길이가 다르면 아나그램이 될 수 없습니다.
  6. 문자열을 문자 배열(char array)로 변환한 뒤 각각 정렬합니다.
  7. equals() 함수로 두 배열이 같은지 비교합니다. 같으면 아나그램이고, 다르면 아나그램이 아닙니다.
  8. 결과를 화면에 출력합니다.
  9. 종료 — 프로그램을 마칩니다.

예제 1: 사용자 입력으로 확인하기

아래 예제에서는 사용자가 직접 문자열을 입력하여 결과를 확인할 수 있습니다.

import java.util.Scanner;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        System.out.println("Required packages have been imported");
        String my_string_1, my_string_2;
        Scanner my_scanner = new Scanner(System.in);
        System.out.println("A reader object has been defined ");
        System.out.print("Enter the first string : ");
        my_string_1 = my_scanner.nextLine();
        System.out.print("Enter the second string : ");
        my_string_2 = my_scanner.nextLine();
        my_string_1 = my_string_1.toLowerCase();
        my_string_2 = my_string_2.toLowerCase();
        if(my_string_1.length() == my_string_2.length()) {
            char[] my_array_1 = my_string_1.toCharArray();
            char[] my_array_2 = my_string_2.toCharArray();
            Arrays.sort(my_array_1);
            Arrays.sort(my_array_2);
            boolean my_result = Arrays.equals(my_array_1, my_array_2);
            if(my_result) {
                System.out.println("The strings "+my_string_1 + " and " + my_string_2 + " are anagram.");
            } else {
                System.out.println("The strings "+my_string_1 + " and " + my_string_2 + " are not anagram.");
            }
        } else {
            System.out.println("The strings "+my_string_1 + " and " + my_string_2 + " are not anagram.");
        }
    }
}

실행 결과

Required packages have been imported
A reader object has been defined
Enter the first string : Race
Enter the second string : Care
The strings race and care are anagram.

예제 2: 미리 정의된 값으로 확인하기

아래 예제에서는 문자열 값이 코드 내에 미리 정의되어 있으며, 콘솔에 바로 출력됩니다.

import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        System.out.println("Required packages have been imported");
        String my_string_1, my_string_2;
        my_string_1 = "Race";
        my_string_2 = "Care";
        System.out.println("The two strings are defined as " +my_string_1 +" and " + my_string_2);
        my_string_1 = my_string_1.toLowerCase();
        my_string_2 = my_string_2.toLowerCase();
        if(my_string_1.length() == my_string_2.length()) {
            char[] my_array_1 = my_string_1.toCharArray();
            char[] my_array_2 = my_string_2.toCharArray();
            Arrays.sort(my_array_1);
            Arrays.sort(my_array_2);
            boolean my_result = Arrays.equals(my_array_1, my_array_2);
            if(my_result) {
                System.out.println("The strings "+my_string_1 + " and " + my_string_2 + " are anagram.");
            } else {
                System.out.println("The strings "+my_string_1 + " and " + my_string_2 + " are not anagram.");
            }
        } else {
            System.out.println("The strings "+my_string_1 + " and " + my_string_2 + " are not anagram.");
        }
    }
}

실행 결과

Required packages have been imported
The two strings are defined as Race and Care
The strings race and care are anagram.

정리

두 문자열이 아나그램인지 확인하는 핵심은 ① 대소문자 통일 → ② 길이 비교 → ③ 문자 배열 정렬 → ④ 배열 동등성 비교의 네 단계입니다. 이 방법은 시간 복잡도 O(n log n)으로 동작하며, 문자 빈도를 직접 세는 방식(O(n))보다 구현이 간단하다는 장점이 있습니다. 실무에서는 공백이나 특수문자 처리 여부에 따라 전처리 로직을 추가하는 것이 좋습니다.