인터넷에서 이것 저것 구경하다가 유용할 것 같아서...
유니코드에서 한글이 입력되어 있는 구조를 이해하고 자음, 모음 개수와 초성, 중성, 종성을 찾는 과정이 참 재미있다.
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§ion=kin.qna.all&rank=12&search_sort=3&spq=1
'Program > Java Core' 카테고리의 다른 글
[Java] 재귀함수를 이용한 폴더 복사 (0) | 2013.01.17 |
---|---|
[Java] 재귀함수를 이용한 폴더 삭제 (0) | 2013.01.17 |
[Java] Vector와 ArrayList, LinkedList의 차이점 (0) | 2013.01.10 |
[Java] java.util.Iterator 인터페이스 (0) | 2011.07.07 |