제가 이번에 한글 변환기(예를 들면
dkssud을
안녕으로 바꿔주는 기계)에 해당하는 함수를 만들 필요성을 느껴서 만들기로 했는데,
예제가 전부 말이 아니고 어떤 건 유료인 것까지 있어서 제가 그냥 강좌를 쓰기로 했습니다. (
한글 오토마타라고 하나요?)
초기에 만든 것(
주의! 예전 블로그인 네이버로 갑니다.)은 haansoft 뿐만 아니라 모든 자음분할, 모음분할자에 문제가 있어서 새로 만든 겁니다.
예전 알고리즘은 뭐였냐면
모든 완성자는 초성이 반드시 한 번을 입력한다.의 원리를 이용한 겁니다.
예를 들어
dkssud이 있으면, 뒤에서부터 읽어가며, 자음을 봅니다.
(편의상 자음을
파란색, 모음을
빨간색으로 표시하겠습니다.)
dkssud에서 두 번째부터 첫 자음을 초성으로 처리합니다. (초성은 검은색)
d
kss
ud
이제 분리가 되었죠. 이게 바꾸는 원리였는데
원리를 보니 왜 자음분할, 모음분할자에 문제가 있는지 알겠죠.
그래서 이번 알고리즘은
일정한 문자를 보고 입력원리를 그대로 적용합니다!
자음분할자로 해 보겠습니다. 으-음... 예제는
rsefkiju로 해 보겠습니다. 끊는 위치를 찾는 겁니다.
끊는 위치만 찾으면 그 다음부터는 쉬우니까요.
1) 먼저 자음 = 0, 모음 = 1을 넣습니다.
특수문자가 보이면 바로 끊습니다.
r
|
s
|
e
|
f
|
k
|
i
|
j
|
u
|
0
|
0
|
0
|
0
|
1
|
1
|
1
|
1
|
어이구 표 한번 그리기 진짜 힘드네
2) 이제부터
초성 = 0
앞에 초성이 없는 중성 = 1
합성 가능한 종성 = 2
초성이 있는 중성 = 3
포화상태의 종성 = 4
이라고 합시다.
다음 진리표에 따라 값을 채웁니다.
전 값이 없으면 그대로 둡니다.
전 값
|
현 값
|
행동 요령(값)
|
0
|
0
|
그 곳에서 끊음
|
0
|
1
|
3
|
1
|
0
|
그 곳에서 끊음
|
1
|
1
|
합쳐지지 않으면 끊음
|
2
|
0
|
합쳐지면 4 아니면 끊음
|
2
|
1
|
그 전 곳에서 끊음
|
3
|
0
|
2
|
3
|
1
|
합쳐지면 3 아니면 끊음
|
4
|
0
|
그 곳에서 끊음
|
4
|
1
|
그 전 곳에서 끊음
|
이렇게 하면 되겠죠. 옛한글이라면 입력기가 어떻게 되었을까 생각도 드네요.
이 예제는 채우다 중간에서 끊기네요. r과 s 사이에서 끊기네요.
조금 더 좋은 예제로 해봅시다.
qnpfrz로 해 봅시다.
이렇게 됩니다. 그 다음에 시도해 보면, (시도 중인 건 빨간색으로 표시합니다)
첫 번째 n입니다. 0-1이므로 3으로 값을 바꿉니다.
두 번째 p인데, 3-1 조합에서 n과 p는 합쳐지므로(ㅞ로 합쳐짐) 3으로 바꿉니다.
세 번째 문자 조합에서 3-0이므로 2로 바뀝니다.
네 번째 문자 조합에서, 2-0 조합인데 합쳐지므로(ㄺ) 값을 4로 바꿉니다.
다섯 번째의 문자 조합 4-0은 그 곳에서 끊습니다. 즉 'qnpfr' 'z'로 끊기는 겁니다.
이 문자열을 변환하여 합치는 알고리즘은 유니코드를 조금만 해 보셨다면 금방 알 수 있습니다.
바꾸면 '뷁' 'ㅋ'입니다.
즉 주어진 문자열은 '뷁ㅋ'가 되는 것입니다.
(이번 강의는 잘 썼나요?)
다음에는 이것을 구현하는 코드를 같이 보도록 하겠습니다. 이 알고리즘을 구현하기 위해서는 버퍼라는 게 필요한데, 그것도 설명하도록 하겠습니다.