카테고리 없음

영어 애너그램 푸는 프로그램 제작(java)

이륙 2021. 7. 3. 02:25

 애너그램을 푸는 프로그램을 만들어 보겠다고 다짐한지는 꽤 되었다. 그 당시에 국내외 자료를 찾았을 때 도움이 될 것같은 정보를 찾지 못해서 포기했던 프로젝트이다.

 하지만 벽만 보고 있어도 재미있는게 시험기간 아닌가. 시험이 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 부분에서 잘 작동하지 않아 결국 실패하고 말았다.