애너그램을 푸는 프로그램을 만들어 보겠다고 다짐한지는 꽤 되었다. 그 당시에 국내외 자료를 찾았을 때 도움이 될 것같은 정보를 찾지 못해서 포기했던 프로젝트이다.
하지만 벽만 보고 있어도 재미있는게 시험기간 아닌가. 시험이 3일 남았을 시점에 정말 불현듯 이 프로젝트가 떠올랐다. 다시 해볼까? 하는. 해서는 안 되는 생각을 해버리고 말았고 이 프로젝트를 시작했다.
내가 세운 알고리즘은 대략 이렇다. 우선 입력받은 단어를 초성, 중성, 종성으로 나누고 그 초성, 중성, 종성을 각각 섞어 그 단어로 만들 수 있는 애너그램을 만들어 사전 api로 실제 있는 단어인지 대조하는 것이었다. 또, 단어를 하나 만든 후 배열에 저장해 다음에 만든 단어가 혹시 이미 만들어졌던 단어인지 확인하는 과정도 추가했고 한 단어로 만들 수 있는 애너그램의 수는 초성의 수 팩토리얼, 중성의 수 팩토리얼, 종성의 수 팩토리얼을 곱한 수로 계산하였다.
하지만 프로그램이 어느 정도 완성되었다고 느꼈을 때 프로그램이 작동하지 않았다. 나름 문제가 될 수 있을 듯한 부분은 전부 수정하였는데도 변함이 없었다. 코드를 다시 짜기에는 귀찮기도 하고 힘들기도 해 한글용으로 제작된 프로그램을 살짝 개조해 영어용으로 만들었다.
영어가 더 쉬웠다. 입력 받은 단어를 알파벳 단위로 분해하고 그것을 한 배열에 넣은 후 그 배열을 섞어주면 되었다. 한글에서 오류가 났던 부분인 단어 조합에서 문제를 고려하지 않아도 되었다.
전체 코드는 이러하다.
import java.util.Scanner;
import java.awt.Desktop;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
public class EnglishAnagram {
public static void main (String[] args) {
Finder ();
}
public static void Finder () {
Scanner sc = new Scanner(System.in);
String str;
System.out.println("애너그램을 입력하세요.");
str = sc.nextLine();
String[] array = str.split("");
ArrayList<String> list = new ArrayList();
ArrayList<String> overlap = new ArrayList();
for (int i=0;i<array.length;i++) {
list.add(array[i]);
}
for (int i=0;i<Factorial(list.size());i++) {
String result1;
do {
Collections.shuffle(list);
result1 = String.join("", list);
} while (true == overlap.contains(result1));
overlap.add(result1);
String result = "";
String u = "https://api.dictionaryapi.dev/api/v2/entries/en_US/" + result1;
try {
//while (false == result.contains("meanings")) {
URL url = new URL(u);
BufferedReader bf;
bf = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
result = bf.readLine();
//}
System.out.println (result1);
} catch(Exception e) {
e.printStackTrace();
}
}
Finder ();
}
public static int Factorial(int num) {
int fac = 1;
for (int i = num; i > 0; i--) {
}
return fac;
}
}
한글용 프로그램을 만들어 보기는 하였으나 이상하게 api 부분에서 잘 작동하지 않아 결국 실패하고 말았다.