본문 바로가기

Program/Java Core

[Java] 한글의 자음, 모음 개수 찾는 프로그램 소스

인터넷에서 이것 저것 구경하다가 유용할 것 같아서...

유니코드에서 한글이 입력되어 있는 구조를 이해하고 자음, 모음 개수와 초성, 중성, 종성을 찾는 과정이 참 재미있다. 



import java.util.Scanner;


public class HangeulTest {

private static final char[] CHOSUNG = { 'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ',

'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ' };

private static final char[] JUNGSUNG = { 'ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ',

'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ',

'ㅣ' };

private static final char[] JONGSUNG = { ' ', 'ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ',

'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ',

'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ' };

// Hangul Syllables Unicode Chart

// http://www.unicode.org/charts/PDF/UAC00.pdf

private static final int BASE_CODE = 44032; // 0xAC00

private static final int NEXT_CHOSUNG_CODE = 588; // 중성의 개수 * 종성의 개수

private static final int NEXT_JUNGSUNG_CODE = 28; // 종성의 개수


private static int base(char c) {

return (int) c - BASE_CODE;

}


private static int chosung(int base) {

return base / NEXT_CHOSUNG_CODE;

}


private static int jungsung(int base, int chosungIdx) {

return (base - (NEXT_CHOSUNG_CODE * chosungIdx)) / NEXT_JUNGSUNG_CODE;

}


private static int jongsung(int base, int chosungIdx, int jungsungIdx) {

return base - (NEXT_CHOSUNG_CODE * chosungIdx)

- (NEXT_JUNGSUNG_CODE * jungsungIdx);

}


public static void main(String[] args) {

int[] chosungCnt = new int[CHOSUNG.length];

int[] jungsungCnt = new int[JUNGSUNG.length];

int[] jongsungCnt = new int[JONGSUNG.length];

for (int i = 0; i < chosungCnt.length; i++)

chosungCnt[i] = 0;

for (int i = 0; i < jungsungCnt.length; i++)

jungsungCnt[i] = 0;

for (int i = 0; i < jongsungCnt.length; i++)

jongsungCnt[i] = 0;

Scanner in = new Scanner(System.in);

System.out.print("단어 입력 : ");

String str = in.nextLine();

in.close();

char[] cArr = str.toCharArray();

for (char c : cArr) {

if ((int) c >= 44032 && (int) c <= 55203) {

int base = base(c);

int chosungIdx = chosung(base);

int jungsungIdx = jungsung(base, chosungIdx);

int jongsungIdx = jongsung(base, chosungIdx, jungsungIdx);

System.out.printf("한글 : %c (%d)\n", c, (int) c);

System.out.printf("초성 : %c (%d)\n", CHOSUNG[chosungIdx],

chosungIdx);

System.out.printf("중성 : %c (%d)\n", JUNGSUNG[jungsungIdx],

jungsungIdx);

System.out.printf("종성 : %c (%d)\n", JONGSUNG[jongsungIdx],

jongsungIdx);

System.out.println();

chosungCnt[chosungIdx]++; // 초성 count

jungsungCnt[jungsungIdx]++; // 중성 count

jongsungCnt[jongsungIdx]++; // 종성 count

}

}

for (int i = 0; i < chosungCnt.length; i++) {

if (chosungCnt[i] != 0)

System.out.printf("초성 %c의 횟수는 %d회입니다.\n", CHOSUNG[i], chosungCnt[i]);

}

for (int i = 0; i < jungsungCnt.length; i++) {

if (jungsungCnt[i] != 0)

System.out.printf("중성 %c의 횟수는 %d회입니다.\n", JUNGSUNG[i], jungsungCnt[i]);

}

for (int i = 0; i < jongsungCnt.length; i++) {

if (jongsungCnt[i] != 0)

System.out.printf("종성 %c의 횟수는 %d회입니다.\n", JONGSUNG[i], jongsungCnt[i]);

}

}

}



Reference URL : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=164744920&qb=amF2YQ==&enc=utf8&section=kin.qna.all&rank=12&search_sort=3&spq=1