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

Java로 문자열 패턴이 일치하는 항목 찾기: 리스트에서 유사 단어 검색 방법

리스트에 저장된 여러 문자열 중에서 입력된 패턴과 구조가 동일한 모든 단어를 찾고 싶다면, 각 문자열을 고유한 숫자 코드로 인코딩하여 비교하는 방법이 효과적입니다. 이 글에서는 HashMap을 활용해 문자열의 패턴을 추출하고, 이를 기반으로 유사 항목을 찾아내는 Java 프로그램을 소개합니다.

패턴 매칭의 원리

핵심 아이디어는 간단합니다. 문자열에서 처음 등장하는 순서대로 각 문자에 번호를 부여하면, 철자가 달라도 구조가 같은 문자열은 동일한 숫자 시퀀스를 갖게 됩니다.

예를 들어 "ddcc"와 "aabb"는 서로 다른 알파벳으로 이루어져 있지만, 두 문자 모두 '앞의 두 글자는 같고 뒤의 두 글자는 같다'는 동일한 패턴을 가집니다. 따라서 두 문자열을 인코딩하면 둘 다 "0011"이라는 같은 결과가 나옵니다.

예제 코드

import java.io.*;
import java.util.*;
public class Demo {
    static String string_encoding(String str) {
        HashMap<Character, Integer> my_map = new HashMap<>();
        String result = "";
        int i = 0;
        char ch;
        for (int j = 0; j < str.length(); j++) {
            ch = str.charAt(j);
            if (!my_map.containsKey(ch))
                my_map.put(ch, i++);
            result += my_map.get(ch);
        }
        return result;
    }
    static void match_words(String[] my_arr, String my_pattern) {
        int len = my_pattern.length();
        String hash_val = string_encoding(my_pattern);
        for (String word : my_arr) {
            if (word.length() == len && string_encoding(word).equals(hash_val))
                System.out.print(word + " ");
        }
    }
    public static void main(String args[]) {
        String[] my_arr = { "mno", "aabb", "pqr", "xxyy", "mmnn" };
        String my_pattern = "ddcc";
        System.out.println("배열에서 ddcc와 패턴이 유사한 단어는 :");
        match_words(my_arr, my_pattern);
    }
}

실행 결과

배열에서 ddcc와 패턴이 유사한 단어는 :
aabb xxyy mmnn

코드 상세 설명

1. string_encoding 메서드

Demo 클래스에는 string_encoding이라는 정적 메서드가 정의되어 있습니다. 이 메서드는 HashMap<Character, Integer>을 생성한 뒤, 전달받은 문자열을 한 글자씩 순회하며 다음 작업을 수행합니다.

  • 현재 문자가 HashMap에 없으면, 새로운 키로 추가하면서 순차적인 번호(0부터 시작)를 값으로 저장합니다.
  • 이미 존재하는 문자라면 기존에 부여된 번호를 그대로 가져옵니다.
  • 각 문자에 해당하는 번호를 결과 문자열에 이어 붙여 최종 인코딩 값을 반환합니다.

2. match_words 메서드

match_words 메서드는 문자열 배열과 기준 패턴을 매개변수로 받습니다. 먼저 패턴의 길이와 인코딩 값을 계산한 후, 배열의 각 단어를 순회하며 다음 두 조건을 확인합니다.

  1. 단어의 길이가 패턴의 길이와 같은지
  2. 단어를 인코딩한 결과가 패턴의 인코딩 값과 일치하는지

두 조건을 모두 만족하는 단어만 콘솔에 출력됩니다.

3. main 메서드

main 함수에서는 "mno", "aabb", "pqr", "xxyy", "mmnn" 다섯 개의 단어를 담은 문자열 배열과 패턴 "ddcc"를 정의합니다. 이후 match_words 메서드를 호출하면, 패턴과 구조가 동일한 세 단어(aabb, xxyy, mmnn)가 화면에 출력됩니다.

마무리

이 방식은 오타 감지, 유사 단어 검색, 암호학적 패턴 분석 등 다양한 분야에 응용할 수 있습니다. 특히 문자열 자체가 아니라 문자의 반복 구조를 비교하기 때문에, 철자가 완전히 달라도 형태가 같은 문자열을 손쉽게 걸러낼 수 있다는 점이 큰 장점입니다.