대강 이런 것.
추가 매핑들을 작성해줘.
청음/탁음/반탁음 모든 경우의 수에 대해 코드를 작성해줘
(코드 블록 기능 작동안하네요.)
아래 코드가 인공지능이 작성해준겁니다.
public class JapaneseNormalizer {
private static final Map<Character, List<Character>> NORMALIZE_MAP = new HashMap<>();
private static final Map<Character, Character> KATAKANA_TO_HIRAGANA = new HashMap<>();
static {
initializeNormalizeMap();
initializeKanaMap();
}
private static void addNormalizeMapping(char c, Character... variants) {
List<Character> allVariants = new ArrayList<>();
allVariants.add(c); // 자기 자신을 포함
allVariants.addAll(Arrays.asList(variants));
NORMALIZE_MAP.put(c, allVariants);
// 각 변형에 대해서도 동일한 리스트 매핑
for (char variant : variants) {
NORMALIZE_MAP.put(variant, allVariants);
}
}
private static void initializeNormalizeMap() {
// た행
addNormalizeMapping('た', 'だ');
addNormalizeMapping('ち', 'ぢ');
addNormalizeMapping('つ', 'づ');
addNormalizeMapping('て', 'で');
addNormalizeMapping('と', 'ど');
// か행
addNormalizeMapping('か', 'が');
addNormalizeMapping('き', 'ぎ');
addNormalizeMapping('く', 'ぐ');
addNormalizeMapping('け', 'げ');
addNormalizeMapping('こ', 'ご');
// さ행
addNormalizeMapping('さ', 'ざ');
addNormalizeMapping('し', 'じ');
addNormalizeMapping('す', 'ず');
addNormalizeMapping('せ', 'ぜ');
addNormalizeMapping('そ', 'ぞ');
// は행 (3가지 변형)
addNormalizeMapping('は', 'ば', 'ぱ');
addNormalizeMapping('ひ', 'び', 'ぴ');
addNormalizeMapping('ふ', 'ぶ', 'ぷ');
addNormalizeMapping('へ', 'べ', 'ぺ');
addNormalizeMapping('ほ', 'ぼ', 'ぽ');
}
private static void initializeKanaMap() {
// 기본 문자
KATAKANA_TO_HIRAGANA.put('ア', 'あ');
KATAKANA_TO_HIRAGANA.put('イ', 'い');
KATAKANA_TO_HIRAGANA.put('ウ', 'う');
KATAKANA_TO_HIRAGANA.put('エ', 'え');
KATAKANA_TO_HIRAGANA.put('オ', 'お');
// か행
KATAKANA_TO_HIRAGANA.put('カ', 'か');
KATAKANA_TO_HIRAGANA.put('キ', 'き');
KATAKANA_TO_HIRAGANA.put('ク', 'く');
KATAKANA_TO_HIRAGANA.put('ケ', 'け');
KATAKANA_TO_HIRAGANA.put('コ', 'こ');
KATAKANA_TO_HIRAGANA.put('ガ', 'が');
KATAKANA_TO_HIRAGANA.put('ギ', 'ぎ');
KATAKANA_TO_HIRAGANA.put('グ', 'ぐ');
KATAKANA_TO_HIRAGANA.put('ゲ', 'げ');
KATAKANA_TO_HIRAGANA.put('ゴ', 'ご');
// ... (나머지 가타카나-히라가나 매핑은 동일)
}
public static String toHiragana(String input) {
StringBuilder converted = new StringBuilder();
for (char c : input.toCharArray()) {
Character hiragana = KATAKANA_TO_HIRAGANA.get(c);
converted.append(hiragana != null ? hiragana : c);
}
return converted.toString();
}
public static List<String> getAllNormalizedVariants(String input) {
// 먼저 가타카나를 히라가나로 변환
String hiragana = toHiragana(input);
List<String> variants = new ArrayList<>();
variants.add(hiragana); // 원본 추가
// 각 위치별로 가능한 변형 생성
char[] chars = hiragana.toCharArray();
for (int i = 0; i < chars.length; i++) {
List<String> newVariants = new ArrayList<>();
for (String variant : variants) {
char currentChar = variant.charAt(i);
List<Character> possibleChars = NORMALIZE_MAP.get(currentChar);
if (possibleChars != null) {
for (char newChar : possibleChars) {
if (newChar != currentChar) { // 현재 문자와 다른 경우만 변형 생성
char[] newChars = variant.toCharArray();
newChars[i] = newChar;
newVariants.add(new String(newChars));
}
}
}
}
variants.addAll(newVariants);
}
return variants;
}
// 테스트 코드
public static void main(String[] args) {
String test = "たべる";
List<String> variants = getAllNormalizedVariants(test);
System.out.println("Original: " + test);
System.out.println("Variants (" + variants.size() + "):");
for (String variant : variants) {
System.out.println(variant);
}
}
}