2015년 10월 4일 일요일

컴퓨터 속의 데이터 정렬 (Sorting) 방법



거품이 위로 올라가듯이 상승 중인 가벼운 물체는 바로 자기 위의 것과 자신의 무게를 비교한다. 자신이 가벼우면 자리를 바꾼다. 그 과정에서 모든 것과 비교를 하니 약 N²/2회의 비교를 해야 한다. 이미 정렬이 된 것도 비교 시간은 소모된다. 역순일 때는 자리바꿈도 약 N²/2회의 시간을 소모한다. 자리바꿈 1회는 3회 대입에 해당한다. 가장 무식하고 느린 방법이다.

a ↔ b (자리바꿈)
a → c (보관)
b → a (이동)
c → b (복구)



최소치를 찾아 순서대로 배치하는 방법이다. 최소치를 찾는 과정에서 역시 모든 것과 비교를 하니 약 N²/2회의 비교를 해야 한다. 이미 정렬이 된 것도 비교 시간은 소모 된다. 자리 바꿈 N회의 시간이 추가 된다. 자리바꿈 1회 = 3회 대입. 자리 바꿈 시간에서 거품 정렬보다 유리하다.



자기 자리를 찾아 삽입하는 과정에서 많은 양의 데이터 이동이 필요하다. 허나 부분적으로 정렬이 되어 있는 경우는 삽입 시간을 줄여준다. 이미 정렬이 된 것에는 삽입 시간은 없지만 비교 시간은 약 N²/2회가 소모 된다. 삽입이 없으니 선택 정렬보다 좀 빠르다. 반대로 역순인 경우는 비교 시간이 N회이고 삽입 시간이 약 N²/2회 소모 된다. 비교(뺄셈)나 이동(대입)이나 시간이 거의 비슷할 것이다. 자리바꿈은 3회 대입, 삽입은 1회 대입이라 선택 정렬보다 조금 빠르다.

a(1) → a(2) → a(3) → a(4) (삽입)
a(4) → temp (보관)
a(3) → a(4) (이동)
a(2) → a(3) (이동)
a(1) → a(2) (이동)
temp → a(1) (복구)





기준 값보다 큰 것들과 작은 것들로 양분하는 것을 반복하는 것인데 이 과정에서 다음 단계에선 앞 단계보다 비교할 상대가 줄어들어 비교 시간을 줄여준다. 약 N*log₂N회의 시간이 소모된다. 이런 것을 분할 점령법이라 한다. 정렬 상태일 때는 비교 시간만 소모 된다. 역순일 때는 자리 바꾸는 시간이 추가로 약간(N/2회) 소모 된다. 기준 값을 잠시 보관하기 위해서 마지막 값과 자리를 바꾼다. 그 후에 기준 값을 제자리에 박아 넣는다. 그렇지 않을 경우 기준치를 보관하는 장소가 배열 크기만큼 필요하다. 재귀 호출을 할 경우는 스택에 이 정도의 메모리를 차지하게 되니 불안정하다. 스택의 한계가 정렬할 수 있는 배열의 크기가 된다. 자기 자리에 박힌 기준 값은 다시는 움직일 필요가 없다. 가장 빠른 정렬법이다.



정수를 자릿수별로 정렬한다는 것이다. 100단위, 10단위, 1단위 순으로 비교를 한다는 말이다. 큰 단위를 나누고 그 속에서 작은 단위로 나누는 전략은 퀵 정렬과 같다. 퀵 정렬의 기준치 대신 기수를 이용한 것이다. 분할 점령법이라 비교 시간이 약 N*log₂N회로 준다. 컴퓨터에서 정수는 2진수이니까 비트의 자리수의 0과 1을 검사하거나 그 수의 이상과 이하로 나누면서 정렬할 수 있다. 역시 정수에 대해선 가장 빠르다.



2명씩 짝을 이뤄 승자와 패자를 가른다. 그 다음에 4명씩 짝을 이뤄 서열을 정한다. 그 다음에 8명씩 짝을 이뤄 서열을 정한다. 이렇게 부분적으로 서열을 정한 후에 삽입 정렬을 하면 속도가 빠른 것을 이용한 것이다. 삽입 정렬에서 비교 시간과 이동 시간은 배열 규모의 제곱에 비례한다. 고로 분할하여 미리 서열을 정하면 시간이 많이 절약 된다. 역순일 때 마지막에 대규모의 삽입정렬에선 50%는 순서가 잡혀 있기 때문에 N/2회 비교와 삽입이 필요하다.퀵 정렬보다 약간 느리다.

n = 8
8*8 = 64 (통으로 할 때의 시간)
4*4 = 16, 16*2 = 32 (2등분)
2*2 = 4, 4*4 = 16 (4등분)




합병, 병합 정렬은 약간 어설픈 분할 점령법이다. 셸 정렬과 흡사한 것이 2진 트리를 만들어 승자와 패자를 결정하는 식으로 부분적으로 정렬하는 것이다. 이웃집과 서열을 결정할 때는 삽입 정렬과 비슷하지만, 삽입 정렬을 하지 않고 서열 순서대로 서로 비교하여 새로운 목록을 만든다. 그러면 비교 시간도 삽입 정렬보다 짧고, 삽입 시간도 없다. 대신 작업용 메모리가 배열만큼 필요하다. 그래도 느리다.

if A(x) >= B(y) then
 A(x) 출력, x 증가
else
 B(y) 출력, y 증가
end if



힙 정렬은 선택 정렬과 비슷하게 최소치, 최대치를 골라낸다. 그런데 그 방법이 토너먼트 식이다. 토너먼트 방식이라고 해도 최소치, 최대치 고를 때는 약 N번의 비교를 해야 한다. 2진 트리를 구성해서 자기 엄마와 자식 사이에 비교를 통해 자리 바꾸기를 하여 최소치, 최대치를 정상(배열의 앞)으로 보낸다. 이것을 마지막 자리와 바꾸고 다시 N-1개를 가지고 2진 트리를 구성하여 다시 최소치, 최대치를 앞으로 뽑는다. 이 것을 반복한다. 마지막에 앞뒤의 순서를 뒤바꾼다. 이 복잡한 짓을 왜 하지? 그냥 선택 정렬과 다를 게 없어 보이는데? 이것도 느리다.



인터넷의 여러 실험 결과를 보면 퀵 정렬, 셸 정렬이 단순하면서도 가장 빠르다. 기수 정렬도 비슷한 효과를 낼 것이다. 이유는 정말 노골적으로 간단한 분할 점령 방식이라서 그렇다. 비교 회수가 일단 약 N²/2에서 N*log₂N으로 줄어든다. 다른 방법들은 복잡하기만 하지 그렇게 빠르지는 않다.






  • e=mc², 질량 에너지 보존의 법칙, 질량과 에너지의 총합은 일정하다.
  • 빈부 격차 보존의 법칙 = 부자와 거지의 재산의 총합은 일정하다.
  • 시공간 보존의 법칙 = 시간과 공간의 곱은 일정하다.
  • 품질 = 시간×비용
  • 행복 = 여가+소득, 인생 보존의 법칙.

질량 보존의 법칙은 잘 이해하고 있을 것이다. 에너지는 돈이고 질량은 물질이라고 하자. 돈은 물질로 바꿀 수 있다. 돈을 주고 물질을 샀으니 돈은 없어지고 물질이 생겼다.

부자가 늘어나면 거지도 늘어난다. 부자가 더 부유해지면 거지는 더 가난해진다. 부자의 돈은 세상에서 긁어모은 것이기 때문이다. 99명이 1명에게 돈을 몰아주는 것이다.

10명이 1시간 동안 할 일은 5명이 2시간, 2명이 5시간, 1명이 10시간을 해야 하는 노동량이다. 병렬처리를 하면 공간을 낭비하지만 시간은 절약된다. 직렬처리는 식간을 낭비하지만 공간이 절약된다. 컴퓨터에서도 메모리를 많이 쓰면 프로그램이 간단명료하고 빨라진다. 메모리 제약이 있으면 프로그램이 복잡하고 느려진다.

품질은 시간과 비용에 비례한다. 공기업 민영화(사유화)를 하면 이상하게 비용은 올라가는데 품질은 떨어진다. 손님과 하인을 동시에 착취해서 그렇다. 손님에겐 비싸게 팔고, 하인은 싸게 부려먹는 것이다.

노동 시간이 많으면 소득은 늘겠지만 여가시간이 줄어든다. 인생의 시간은 정해져 있으니 여가시간이든 노동시간이든 어느 한쪽으로만 사용할 수 있다.

2015년 9월 20일 일요일

컴퓨터 속의 한글 처리 기술 (초중성 음소 조립 → 완성형, 유니코드)



한글은 세종대왕 머리에서 뚝딱 만들어진 것이 아니다. 여러 나라의 문자를 참고하여 만든 것이다. 수메르 설형 문자(쐐기문자)는 서방에서 사라졌는데 그와 비슷한 한자는 동방에 여전히 살아 있다. 원래 한나라 시대의 한자는 상형문자였다. 당송 시대에 지금처럼 획으로 표현하는 설형 문자와 비슷하게 된다. 한자의 원리는 실제로 설형 문자의 원리와 같다. 인간 머리는 거기서 거기다.

서방에선 이집트 상형 문자가 점차 표음 문자로 발전한다. 처음엔 음절 문자가 생기는데 받침소리가 거의 없는 일본어, 로마 라틴어 같은 언어에 적합하다. 이런 받침 없는 언어는 50개 정도의 문자로 소리를 표현할 수 있다. 그 후에 자음, 모음, 받침을 구분하는 음소 문자로 발전한다. 일본 문자가 한글보다 먼저 만들어진 것이다. 나중에 만들었다면 한글과 비슷했겠지.

이집트 상형문자에서 페니키아 표음 문자가 나오고, 거기서 그리스 알파벳이 탄생하고, 로마인들도 그 영향을 받아 로마 알파벳을 만든다. 로마 알파벳은 현재 영어와 서유럽에서 쓰고 있다. 러시아 사람들도 그리스/로마 둘의 영향을 받아 자기들 키릴 문자를 만들었다. 유럽엔 이렇게 3종류의 알파벳이 있다. 페니키아 옆의 아람 문자는 중동 아랍 문자의 조상이다. 아람어는 그 지역 공용어였다. 예수도 이 언어로 설교했다. (아람 ≠ 아랍)

이슬람에 의해서 중동의 아랍문자가 중앙아시아 초원에 퍼진다. 몽고족이 위구르 문자의 영향을 받아 자기들 문자를 만들고, 이건 만주족으로 이어진다. 그래서 그런지 아랍문자처럼 꼬불꼬불하다. 단지 쓰는 방향에 차이가 있다. 아랍(우→좌), 동양(상→하), 서양(좌→우). 만주 문자는 馬말 모양이 대단히 많다. 그러니가 馬말이 어떤 일을 할 때의 장면이 바로 그 단어의 첫소리를 의미하는 식이다.

몽골 제국이 국제 공용 문자로 개발한 것이 파스파 문자이다. 외국어 발음 기호로 사용하기 위한 문자로 만든 것이다. 이건 인도, 티베트 문자의 영향을 받은 것이다. 이 문자들은 불교 문화권의 문자이다. 동양에선 한글 이전 가장 좋은 문자이겠다. 한글이 이 영향을 안 받았다고 하는 건 무리겠다. 표음 문자의 원리는 모두 같다.
 
상형 문자를 표음 문자로 만드는 방법은 간단하다. 예를 들어 말(동물) 그림이 있고 그 소리가 “말”이라면 말 그림이 바로 동물(말)이 아닌 “말”이란 소리를 대신하게 되는 식이다. 비슷하게 소 그림이 소가 아니라 그냥 “소”라는 소리를 대신하게 된다. 일본은 한자를 빌려 음절 문자를 만든다. 원리는 비슷하다. 한자의 뜻은 버리고 독음만 취하는 식이다.

처음엔 자음으로만 사용하다가 누군가 모음 표시에도 사용하게 된다. 중동 페니키아 알파벳, 아람 문자, 아랍 문자 계통은 모음 표시를 하지 않는다. 처음 모음 표기는 자음 옆에 점을 찍는 식이었다. 그러다 다른 민족이 안 쓰는 자음을 모음으로 사용하기 시작한다. 선과 점으로만 표시하는 한글 모음을 보면 중동 문자의 영향도 받았음을 알 수 있다.

세종대왕은 만주를 통해 아시아 문자, 몽고 표음 문자, 일본 음절 문자, 중국 한자를 참고하여 한글을 만들었다. 음소 분리에 대해선 이미 이 글자들을 공부하면 간단하게 해결 된다. 한글의 대단한 점은 자음의 형상이 발음 기관의 상형 문자라는 점과 모음을 점과 선으로 표기하는 점이다. 문자 진화의 종점을 찍게 된 것이다. 공짜로 숟가락 얹은 게 아니다.

한글이 그 어떤 문자도 참고하지 않고 세종대왕과 집현전 홀로 독창적으로 만들었단 말은 개소리다.

모방은 창조의 엄마! 발견은 발명의 아빠! 발명은 필요의 부모!
사람 머리는 거기서 거기. 모든 것은 진화다. 진화는 신의 섭리!




지금은 한글 처리를 O/S가 해 주니까 직접 만들어야 할 일은 없겠지만 때론 비행 중에 무인도에 떨어지기도 하니, 불 피우고 낚시하는 법 알고 있어야 하듯이 한글 처리 기본은 알고 있어야 하겠지. 한글도 알파벳 ASCII 코드처럼 코드(숫자)를 부여해야 한다. 인터넷 검색하면 다음과 같은 것이 나온다.


1. 문자 코드 조립


  • N 바이트 코드 : 자음, 모음에 알파벳처럼 1바이트 할당
  • 3 바이트 코드 : 초성, 중성, 종성에 각각 1바이트 할당
  • 2 바이트 코드 : 초/중/종 5비트 조합형, 유니코드, 음절 단위 완성형


한글은 초성, 중성, 종성을 정사각형에 모아서 한자처럼 쓴다. 그런데 알파벳처럼 음소를 옆으로 풀어 쓸 수도 있다. 그와 비슷한 것이 N바이트 코드이다. 이 경우 초성과 종성(받침)의 구분이 없다. 자음과 모음의 구분만 있다. 그래서 음절 구분이 어렵다. 그래서 초성과 종성을 구분하는 3바이트 코드가 생기는데 이렇게 하면 음절 구분이 쉽다. 3바이트 = 1음절.

이걸 2바이트에 압축해 넣는 방법이 나왔는데 완성형, 조합형, 유니코드(16비트)이다. 완성형은 한글을 한자처럼 음절 단위 문자로 본 것이니 음소 구분이 불가능하다. 한글보다 한자에 중심을 주어서 한자를 4888자 배치하고 남은 약 2천 개에 한글을 배치하였다. 부족한 한글은 확장 코드를 붙여 3바이트 초/중/성을 나열하는 식이다. 이걸 한글 코드라고 해야 하나? 중국 코드 아냐? 한글이 모자라서 MS사에서 띨띨한 한국인 불쌍하다며 CP949라고 추가 코드를 만들었다.

조합형은 조립형이라 음소 구분이 가능한데 코드의 낭비가 있다. 거의 사용하지 않는 한글 문자에도 코드가 부여되었다. 사용하지 않는 한글 소리를 모두 나열하면 1만 자가 넘는다. 당연히 한자 넣을 공간이 없다. (아니 머리를 잘 썼다면 충분히 있지.) 조합형, 완성형 이 둘은 ASCII 코드와 호환 되도록 만들었기 때문에 코드의 낭비가 있다. 제어 문자를 피해야 하기 때문이다. 또한 1바이트 아스키 코드인지 2바이트 한글 코드인지를 구분해야 하기 때문에 거의 50% 공간을 낭비한다.

제어 문자는 화면 표시용이 아니라 모니터, 프린터, 타자기 등의 커서(문자가 찍힐 위치) 동작을 지시하는 문자이다. 예를 들어 “삐” 소리 내기, 다음 페이지로 넘기기, 한 줄 넘기기, 한 글자 우측 이동, 한 글자 좌측 이동, 행의 좌측 끝으로 이동 등이다. 아직 옛날 O/S와 기계들이 사용되기 때문에 필요하다. (역시 표준이란 쪽수로 결정 된다.)

유니코드(16비트)는 세계 모든 문자를 16비트로 표현하기 때문에 ASCII 호환을 신경 쓸 필요 없었고 그래서 효율적이다. 영국, 미국 입장에선 2배 낭비라 기억/전송 용량 손해고 한중일 모두에게는 이익이다. 유럽인들에겐 이익도 손해도 없다. 프로그래머 입장에서도 다루기 편해서 좋다.

ASCII와의 호환성을 위해 만든 유니코드(8비트 확장 가능)는 제어 문자를 피해야 하는 문제가 있어 복잡하다. 2바이트 유니코드를 3바이트로 변환하는 방법이 있다. 영국, 미국은 1바이트로 기존과 동일, 유럽은 2바이트로 16비트와 같은 용량, 한국은 3바이트로 불리해진다. 일본은 100개만 있으면 되니까 2바이트로 충분할 것이다.

위치 초성 위치 중성 위치 종성 분해
0 0 0

1 1 1
2 2 2 ㄱㄱ
3 3 3 ㄱㅅ
4 4 4
5 5 5 ㄴㅈ
6 6 6 ㄴㅎ
7 7 7
8 8 8
9 9 9 ㄹㄱ
10 10 10 ㄹㅁ
11 11 11 ㄹㅂ
12 12 12 ㄹㅅ
13 13 13 ㄹㅌ
14 14 14 ㄹㅍ
15 15 15 ㄹㅎ
16 16 16
17 17 17
18 18 18 ㅂㅅ


19 19


20 20 ㅅㅅ




21




22




23




24




25




26




27

위의 표는 초성, 중성, 종성 위치 값이다. 유니 코드 조립 방법은 아래와 같다. 왜 이 간단한 방법을 한국인들은 생각하지 못 했을까? 조합형도 이보다 못 하고, 완성형은 완전히 실망이다. 아직 우리가 어설픈 시절에 만든 것이라 어쩔 수 없다.
 
유니코드 = 한국코드 시작 위치 + 3차원배열(초성, 중성, 종성)
유니코드 = 한국코드 시작 위치 + 초성*588 + 중성*28 + 종성
588 = 21*28


2. 문자 이미지(활자) 조립


으이의응잉읭, 쁘빠뽜쁣빫뽧

  • 초성 6벌 : 모음의 위치(수평선/수직선/수평수직결합)로 구분
  • 중성 2벌 : 받침 유무로 구분(세로 길이 차이)
  • 종성 1벌


문자 코드를 보고 이미지를 찾아 조립해서 화면에 표시해야 한다. 알파벳은 아주 쉽겠지만 한글은 초성, 중성, 종성을 모아서 정사각형에 배치해야 한다. 이런 문제로 인해서 한글도 한자처럼 인쇄, 활자, 타자기 분야에서 서양에 비해 불리했다. 최소한 모양이 예쁘게 나오려면 6+2+1=9벌의 자모음 형상(활자)이 필요하다. 이런 조합은 컴퓨터 시대이기에 가능했고, 인쇄, 활자, 타자기 시절에는 불가능했다. 1만 개의 한자/한글 활자를 1만 개의 서랍에서 찾아 조립하는 것보다는 1쪽을 목판으로 파는 것이 낫다.

예쁜 모양을 포기하고 최소의 이미지(활자)로 조립하려면 자음 1벌과 모음 2벌(받침 유무 구분)로 위치만 살짝 바꾸어 조립하는 방법도 있다. 값 싸고 모양도 그리 나쁘지는 않다. 왜냐하면 자음의 크기를 보면 거의 비슷하기 때문이다. 또는 그냥 알파벳처럼 옆으로 풀어쓰는 방법도 있다. (ㅇㅏㄹㅡㅁㄷㅏㅂㄷㅏ.) 또는 초성, 중성만 조립하고 받침만 옆으로 풀어쓰는 방법도 있다. (아르ㅁ다ㅂ다.) 또는 받침만 기준선 밑으로 붙이는 방법이 있는데 옛날 타자기에서 사용하는 방법이다.

아래 코드는 Excel VB Macro에서 유니코드 한글 음소를 분리하는 예제 함수이다.
 
Public Function split_sound(a)
'한글 초중종 음소 분리
k = Len(a)
split_sound = ""
If k = 0 Then Exit Function
For i = 1 To k
    d = Mid(a, i, 1)
    b = AscW(d)
    If b >= -21504 And b <= -10333 Then '한글이라면
        n = (b + 21504)
        c1 = Int(n / 588)
        c2 = Int((n Mod 588) / 28)
        c3 = (n Mod 28)
        split_sound = split_sound & Mid("ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ", c1 + 1, 1)
        split_sound = split_sound & Mid("ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ", c2 + 1, 1)
        If c3 > 0 Then split_sound = split_sound & Mid("★ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ", c3 + 1, 1)
    Else
        split_sound = split_sound & d
    End If
Next i
End Function


3. 키보드 입력 처리


  • 2벌식 자판 : 자음, 모음만 구분, 음절 구분 어려움(N 바이트 코드)
  • 3벌식 자판 : 초성, 중성, 종성 구분, 음절 구분 쉬움(3 바이트 코드)


키보드 입력에서 음절 구분을 하여 문자 코드를 만들어야 한다. 3벌식 자판인 경우는 음절 구분과 조립이 아주 쉽다. 문제는 사람들이 이 효율적인 자판을 사용하지 않는 것이다. 습관의 힘에 의해서 2벌식을 사용하기 때문에 약간의 프로그램이 필요하다. 영어 자판도 2가지 종류가 있는데 옛날 기계식 타자기 때 개발한 비효율적 QWERTY(좌측 상단 배치 순서임) 방식을 컴퓨터 시대에도 사용하고 있다. 음절 조립은 입력한 문자에 따른 상태 변화도를 그리면 간단하게 프로그램 할 수 있다. 

  • 자+모+자+모 = (자+모)+(자+모) =
  • 자+모+자+자+모 = ((자+모)+자)+(자+모) =
  • 자+모+자+자+자+모 = (((자+모)+자)+자)+(자+모) =

다음에 자+모 조합이 나와야 바로 앞 음절이 끝나는 걸 알 수 있다. 고로 다음 음절까지 기다리는 게 필요한데 영어 자판 처리 프로그램에는 다음 자+모 조합을 기억하는 기능이 없어 한글화 하면 잘 안 되기도 한다. 그래서 마지막 글자는 처리되지 않고 사라지는 경우가 있다. 고로 마지막에 일부러 공백을 몇 개 넣어야 한다. 예로 Unix 사용하는 Mac PC에서 그렇다.

그러니까 화면의 이미지는 세종대왕의 지시에 따라 한자처럼 정사각형에 몰아넣어야 하고, 키보드(타자기) 입력은 알파벳처럼 옆으로 풀어 입력하니 음절을 구분해서 모아야 한다. 이 때 문자 코드가 조합형이나 유니코드(16비트)이면 음소, 음절 구분이 쉽기 때문에 코드 조립도 쉽고, 코드에서 음소를 찾아 화면에 문자 이미지 구성하기도 쉽다. 



4. 완성형 코드 ↔ 음소 분리


그런데 우리가 사용하는 윈도우즈 O/S는 불행히도 완성형을 사용한다. 코드 조립도 어렵고, 코드를 보고 음소를 분리해서 이미지를 찾아 조립하는 것도 어렵다. 이 문제 해결을 위해서 완성형 코드를 음소로 분리하여 대응시킨 표를 만들어야 한다. 그 표는 이 글 마지막에 첨부. 이 표를 완성형으로 저장한 후에 초성, 중성, 종성 3차원 행렬을 이용해서 음소에서 완성형 코드를 찾는다.

그와 반대로 완성형 코드에서 음소를 분리해서 문자 이미지를 조립하는 것은 좀 복잡하다. 아래 링크를 보고 완성형 코드와 음소 대응표는 쉽게 만들 수 있다. 문제는 완성형 코드는 연속이 아니란 것이다. 완성형 + CP949에서 한글 영역에 해당하는 사각형을 보면 중간에 건너 뛰는 빈 공간이 상당히 많다. 이것을 연결해 주는 약간의 계산이 필요하다. 그렇게 하면 연속적인 배열에서 아주 빠른 검색이 가능하다.

완성형 한글 + CP949 문자 코드





상위 바이트란 먼저 나오는 바이트이다. 상위 바이트가 128 이상이면 하위 바이트도 묶어 해석하란 의미다. 고로 2바이트 공간에서 50% 공간은 사용할 수 없게 된다. 상위 바이트가 127 이하이면 상위 하위 구분 없이 7비트 아스키로 해석한다. 아스키에서 65 미만은 제어 문자라 피해야 한다. 그래서 코드가 연속적이지 않고 불연속적이다. 그럼 메모리 낭비다. 약간의 계산으로 불연속적 코드를 연속적 코드로 변형할 수 있다. 연속적 코드로 변형한 후에 검색을 하면 된다.

모든 내부 처리는 유니 코드로 하고 마지막 저장할 때만 유니코드 → 완성형 변환을 해 준다. 이 변환을 할 때 필요한 빠른 검색 표를 만드는 것에 관한 얘기다. 3차원 배열에서 유니코드를 검색하거나 반대로 완성형 코드를 검색하는 것이다. 요즘 컴퓨터는 대부분 내부적으로 유니코드를 사용하고 있을 것이다.



대선은 결선투표제, 총선은 비례대표제가 그래도 가장 합리적이지?

예를 들어 다음과 같은 상황이라고 하자.
  • 1등 40% 독재당
  • 2등 30% 도전당
  • 3등 20% 기회당
  • 4등 10% 포기당

한국과 같은 선거 제도론 겨우 40%의 지지를 받는 독재당에서만 대통령이 나오고, 국회의원도 과반수이상을 독재당이 가져갈 수 있다. 50% 이상의 지역구에서 독재당이 1등으로 당선되기만 하면 되니까.

국민의 지지가 위와 같다면 국회에선 위와 비슷한 비율로 국회의원이 당선되어야 한다. 그게 비례대표제다. 국민의 지지에 비례해서 의석을 할당 받는 것이다. 오로지 1명을 뽑아야 하는 대통령 선거에선 1등과 2등을 가린 후에 이 둘 중에서 선택해야 그래도 국민의 반감을 사지 않은 자가 대통령이 되고, 대통령이 된 자도 자기 지역 이외의 사람들을 신경 쓰게 된다. 그게 결선투표제다. 무조건 50% 이상 지지를 받은 자가 대표가 된다.



00가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기
01각객갹걕걱겍격곅곡곽괙괵굑국궉궥귁귝극긕긱
02갂갞갺걖걲겎겪곆곢곾괚괶굒굮궊궦귂귞귺긖긲
03갃갟갻걗걳겏겫곇곣곿괛괷굓굯궋궧귃귟귻긗긳
04간갠갼걘건겐견곈곤관괜괸굔군권궨귄균근긘긴
05갅갡갽걙걵겑겭곉곥괁괝괹굕굱궍궩귅귡귽긙긵
06갆갢갾걚걶겒겮곊곦괂괞괺굖굲궎궪귆귢귾긚긶
07갇갣갿걛걷겓겯곋곧괃괟괻굗굳궏궫귇귣귿긛긷
08갈갤걀걜걸겔결곌골괄괠괼굘굴궐궬귈귤글긜길
09갉갥걁걝걹겕겱곍곩괅괡괽굙굵궑궭귉귥긁긝긹
10갊갦걂걞걺겖겲곎곪괆괢괾굚굶궒궮귊귦긂긞긺
11갋갧걃걟걻겗겳곏곫괇괣괿굛굷궓궯귋귧긃긟긻
12갌갨걄걠걼겘겴곐곬괈괤굀굜굸궔궰귌귨긄긠긼
13갍갩걅걡걽겙겵곑곭괉괥굁굝굹궕궱귍귩긅긡긽
14갎갪걆걢걾겚겶곒곮괊괦굂굞굺궖궲귎귪긆긢긾
15갏갫걇걣걿겛겷곓곯괋괧굃굟굻궗궳귏귫긇긣긿
16감갬걈걤검겜겸곔곰괌괨굄굠굼궘궴귐귬금긤김
17갑갭걉걥겁겝겹곕곱괍괩굅굡굽궙궵귑귭급긥깁
18값갮걊걦겂겞겺곖곲괎괪굆굢굾궚궶귒귮긊긦깂
19갓갯걋걧것겟겻곗곳괏괫굇굣굿궛궷귓귯긋긧깃
20갔갰걌걨겄겠겼곘곴괐괬굈굤궀궜궸귔귰긌긨깄
21강갱걍걩겅겡경곙공광괭굉굥궁궝궹귕귱긍긩깅
22갖갲걎걪겆겢겾곚곶괒괮굊굦궂궞궺귖귲긎긪깆
23갗갳걏걫겇겣겿곛곷괓괯굋굧궃궟궻귗귳긏긫깇
24갘갴걐걬겈겤곀곜곸괔괰굌굨궄궠궼귘귴긐긬깈
25같갵걑걭겉겥곁곝곹괕괱굍굩궅궡궽귙귵긑긭깉
26갚갶걒걮겊겦곂곞곺괖괲굎굪궆궢궾귚귶긒긮깊
27갛갷걓걯겋겧곃곟곻괗괳굏굫궇궣궿귛귷긓긯깋

00까깨꺄꺠꺼께껴꼐꼬꽈꽤꾀꾜꾸꿔꿰뀌뀨끄끠끼
01깍깩꺅꺡꺽껙껵꼑꼭꽉꽥꾁꾝꾹꿕꿱뀍뀩끅끡끽
02깎깪꺆꺢꺾껚껶꼒꼮꽊꽦꾂꾞꾺꿖꿲뀎뀪끆끢끾
03깏깫꺇꺣꺿껛껷꼓꼯꽋꽧꾃꾟꾻꿗꿳뀏뀫끇끣끿
04깐깬꺈꺤껀껜껸꼔꼰꽌꽨꾄꾠꾼꿘꿴뀐뀬끈끤낀
05깑깭꺉꺥껁껝껹꼕꼱꽍꽩꾅꾡꾽꿙꿵뀑뀭끉끥낁
06깒깮꺊꺦껂껞껺꼖꼲꽎꽪꾆꾢꾾꿚꿶뀒뀮끊끦낂
07깓깯꺋꺧껃껟껻꼗꼳꽏꽫꾇꾣꾿꿛꿷뀓뀯끋끧낃
08깔깰꺌꺨껄껠껼꼘꼴꽐꽬꾈꾤꿀꿜꿸뀔뀰끌끨낄
09깕깱꺍꺩껅껡껽꼙꼵꽑꽭꾉꾥꿁꿝꿹뀕뀱끍끩낅
10깖깲꺎꺪껆껢껾꼚꼶꽒꽮꾊꾦꿂꿞꿺뀖뀲끎끪낆
11깗깳꺏꺫껇껣껿꼛꼷꽓꽯꾋꾧꿃꿟꿻뀗뀳끏끫낇
12깘깴꺐꺬껈껤꼀꼜꼸꽔꽰꾌꾨꿄꿠꿼뀘뀴끐끬낈
13깙깵꺑꺭껉껥꼁꼝꼹꽕꽱꾍꾩꿅꿡꿽뀙뀵끑끭낉
14깚깶꺒꺮껊껦꼂꼞꼺꽖꽲꾎꾪꿆꿢꿾뀚뀶끒끮낊
15깛깷꺓꺯껋껧꼃꼟꼻꽗꽳꾏꾫꿇꿣꿿뀛뀷끓끯낋
16깜깸꺔꺰껌껨꼄꼠꼼꽘꽴꾐꾬꿈꿤뀀뀜뀸끔끰낌
17깝깹꺕꺱껍껩꼅꼡꼽꽙꽵꾑꾭꿉꿥뀁뀝뀹끕끱낍
18깞깺꺖꺲껎껪꼆꼢꼾꽚꽶꾒꾮꿊꿦뀂뀞뀺끖끲낎
19깟깻꺗꺳껏껫꼇꼣꼿꽛꽷꾓꾯꿋꿧뀃뀟뀻끗끳낏
20깠깼꺘꺴껐껬꼈꼤꽀꽜꽸꾔꾰꿌꿨뀄뀠뀼끘끴낐
21깡깽꺙꺵껑껭꼉꼥꽁꽝꽹꾕꾱꿍꿩뀅뀡뀽끙끵낑
22깢깾꺚꺶껒껮꼊꼦꽂꽞꽺꾖꾲꿎꿪뀆뀢뀾끚끶낒
23깣깿꺛꺷껓껯꼋꼧꽃꽟꽻꾗꾳꿏꿫뀇뀣뀿끛끷낓
24깤꺀꺜꺸껔껰꼌꼨꽄꽠꽼꾘꾴꿐꿬뀈뀤끀끜끸낔
25깥꺁꺝꺹껕껱꼍꼩꽅꽡꽽꾙꾵꿑꿭뀉뀥끁끝끹낕
26깦꺂꺞꺺껖껲꼎꼪꽆꽢꽾꾚꾶꿒꿮뀊뀦끂끞끺낖
27깧꺃꺟꺻껗껳꼏꼫꽇꽣꽿꾛꾷꿓꿯뀋뀧끃끟끻낗

00나내냐냬너네녀녜노놔놰뇌뇨누눠눼뉘뉴느늬니
01낙낵냑냭넉넥녁녝녹놕놱뇍뇩눅눡눽뉙뉵늑늭닉
02낚낶냒냮넊넦녂녞녺놖놲뇎뇪눆눢눾뉚뉶늒늮닊
03낛낷냓냯넋넧녃녟녻놗놳뇏뇫눇눣눿뉛뉷늓늯닋
04난낸냔냰넌넨년녠논놘놴뇐뇬눈눤뉀뉜뉸는늰닌
05낝낹냕냱넍넩녅녡녽놙놵뇑뇭눉눥뉁뉝뉹늕늱닍
06낞낺냖냲넎넪녆녢녾놚놶뇒뇮눊눦뉂뉞뉺늖늲닎
07낟낻냗냳넏넫녇녣녿놛놷뇓뇯눋눧뉃뉟뉻늗늳닏
08날낼냘냴널넬녈녤놀놜놸뇔뇰눌눨뉄뉠뉼늘늴닐
09낡낽냙냵넑넭녉녥놁놝놹뇕뇱눍눩뉅뉡뉽늙늵닑
10낢낾냚냶넒넮녊녦놂놞놺뇖뇲눎눪뉆뉢뉾늚늶닒
11낣낿냛냷넓넯녋녧놃놟놻뇗뇳눏눫뉇뉣뉿늛늷닓
12낤냀냜냸넔넰녌녨놄놠놼뇘뇴눐눬뉈뉤늀늜늸닔
13낥냁냝냹넕넱녍녩놅놡놽뇙뇵눑눭뉉뉥늁늝늹닕
14낦냂냞냺넖넲녎녪놆놢놾뇚뇶눒눮뉊뉦늂늞늺닖
15낧냃냟냻넗넳녏녫놇놣놿뇛뇷눓눯뉋뉧늃늟늻닗
16남냄냠냼넘넴념녬놈놤뇀뇜뇸눔눰뉌뉨늄늠늼님
17납냅냡냽넙넵녑녭놉놥뇁뇝뇹눕눱뉍뉩늅늡늽닙
18낪냆냢냾넚넶녒녮놊놦뇂뇞뇺눖눲뉎뉪늆늢늾닚
19낫냇냣냿넛넷녓녯놋놧뇃뇟뇻눗눳뉏뉫늇늣늿닛
20났냈냤넀넜넸녔녰놌놨뇄뇠뇼눘눴뉐뉬늈늤닀닜
21낭냉냥넁넝넹녕녱농놩뇅뇡뇽눙눵뉑뉭늉능닁닝
22낮냊냦넂넞넺녖녲놎놪뇆뇢뇾눚눶뉒뉮늊늦닂닞
23낯냋냧넃넟넻녗녳놏놫뇇뇣뇿눛눷뉓뉯늋늧닃닟
24낰냌냨넄넠넼녘녴놐놬뇈뇤눀눜눸뉔뉰늌늨닄닠
25낱냍냩넅넡넽녙녵놑놭뇉뇥눁눝눹뉕뉱늍늩닅닡
26낲냎냪넆넢넾녚녶높놮뇊뇦눂눞눺뉖뉲늎늪닆닢
27낳냏냫넇넣넿녛녷놓놯뇋뇧눃눟눻뉗뉳늏늫닇닣

00다대댜댸더데뎌뎨도돠돼되됴두둬뒈뒤듀드듸디
01닥댁댝댹덕덱뎍뎩독돡돽됙됵둑둭뒉뒥듁득듹딕
02닦댂댞댺덖덲뎎뎪돆돢돾됚됶둒둮뒊뒦듂듞듺딖
03닧댃댟댻덗덳뎏뎫돇돣돿됛됷둓둯뒋뒧듃듟듻딗
04단댄댠댼던덴뎐뎬돈돤됀된됸둔둰뒌뒨듄든듼딘
05닩댅댡댽덙덵뎑뎭돉돥됁됝됹둕둱뒍뒩듅듡듽딙
06닪댆댢댾덚덶뎒뎮돊돦됂됞됺둖둲뒎뒪듆듢듾딚
07닫댇댣댿덛덷뎓뎯돋돧됃됟됻둗둳뒏뒫듇듣듿딛
08달댈댤덀덜델뎔뎰돌돨됄될됼둘둴뒐뒬듈들딀딜
09닭댉댥덁덝덹뎕뎱돍돩됅됡됽둙둵뒑뒭듉듥딁딝
10닮댊댦덂덞덺뎖뎲돎돪됆됢됾둚둶뒒뒮듊듦딂딞
11닯댋댧덃덟덻뎗뎳돏돫됇됣됿둛둷뒓뒯듋듧딃딟
12닰댌댨덄덠덼뎘뎴돐돬됈됤둀둜둸뒔뒰듌듨딄딠
13닱댍댩덅덡덽뎙뎵돑돭됉됥둁둝둹뒕뒱듍듩딅딡
14닲댎댪덆덢덾뎚뎶돒돮됊됦둂둞둺뒖뒲듎듪딆딢
15닳댏댫덇덣덿뎛뎷돓돯됋됧둃둟둻뒗뒳듏듫딇딣
16담댐댬덈덤뎀뎜뎸돔돰됌됨둄둠둼뒘뒴듐듬딈딤
17답댑댭덉덥뎁뎝뎹돕돱됍됩둅둡둽뒙뒵듑듭딉딥
18닶댒댮덊덦뎂뎞뎺돖돲됎됪둆둢둾뒚뒶듒듮딊딦
19닷댓댯덋덧뎃뎟뎻돗돳됏됫둇둣둿뒛뒷듓듯딋딧
20닸댔댰덌덨뎄뎠뎼돘돴됐됬둈둤뒀뒜뒸듔듰딌딨
21당댕댱덍덩뎅뎡뎽동돵됑됭둉둥뒁뒝뒹듕등딍딩
22닺댖댲덎덪뎆뎢뎾돚돶됒됮둊둦뒂뒞뒺듖듲딎딪
23닻댗댳덏덫뎇뎣뎿돛돷됓됯둋둧뒃뒟뒻듗듳딏딫
24닼댘댴덐덬뎈뎤돀돜돸됔됰둌둨뒄뒠뒼듘듴딐딬
25닽댙댵덑덭뎉뎥돁돝돹됕됱둍둩뒅뒡뒽듙듵딑딭
26닾댚댶덒덮뎊뎦돂돞돺됖됲둎둪뒆뒢뒾듚듶딒딮
27닿댛댷덓덯뎋뎧돃돟돻됗됳둏둫뒇뒣뒿듛듷딓딯

00따때땨떄떠떼뗘뗴또똬뙈뙤뚀뚜뚸뛔뛰뜌뜨띄띠
01딱땍땩떅떡떽뗙뗵똑똭뙉뙥뚁뚝뚹뛕뛱뜍뜩띅띡
02딲땎땪떆떢떾뗚뗶똒똮뙊뙦뚂뚞뚺뛖뛲뜎뜪띆띢
03딳땏땫떇떣떿뗛뗷똓똯뙋뙧뚃뚟뚻뛗뛳뜏뜫띇띣
04딴땐땬떈떤뗀뗜뗸똔똰뙌뙨뚄뚠뚼뛘뛴뜐뜬띈띤
05딵땑땭떉떥뗁뗝뗹똕똱뙍뙩뚅뚡뚽뛙뛵뜑뜭띉띥
06딶땒땮떊떦뗂뗞뗺똖똲뙎뙪뚆뚢뚾뛚뛶뜒뜮띊띦
07딷땓땯떋떧뗃뗟뗻똗똳뙏뙫뚇뚣뚿뛛뛷뜓뜯띋띧
08딸땔땰떌떨뗄뗠뗼똘똴뙐뙬뚈뚤뛀뛜뛸뜔뜰띌띨
09딹땕땱떍떩뗅뗡뗽똙똵뙑뙭뚉뚥뛁뛝뛹뜕뜱띍띩
10딺땖땲떎떪뗆뗢뗾똚똶뙒뙮뚊뚦뛂뛞뛺뜖뜲띎띪
11딻땗땳떏떫뗇뗣뗿똛똷뙓뙯뚋뚧뛃뛟뛻뜗뜳띏띫
12딼땘땴떐떬뗈뗤똀똜똸뙔뙰뚌뚨뛄뛠뛼뜘뜴띐띬
13딽땙땵떑떭뗉뗥똁똝똹뙕뙱뚍뚩뛅뛡뛽뜙뜵띑띭
14딾땚땶떒떮뗊뗦똂똞똺뙖뙲뚎뚪뛆뛢뛾뜚뜶띒띮
15딿땛땷떓떯뗋뗧똃똟똻뙗뙳뚏뚫뛇뛣뛿뜛뜷띓띯
16땀땜땸떔떰뗌뗨똄똠똼뙘뙴뚐뚬뛈뛤뜀뜜뜸띔띰
17땁땝땹떕떱뗍뗩똅똡똽뙙뙵뚑뚭뛉뛥뜁뜝뜹띕띱
18땂땞땺떖떲뗎뗪똆똢똾뙚뙶뚒뚮뛊뛦뜂뜞뜺띖띲
19땃땟땻떗떳뗏뗫똇똣똿뙛뙷뚓뚯뛋뛧뜃뜟뜻띗띳
20땄땠땼떘떴뗐뗬똈똤뙀뙜뙸뚔뚰뛌뛨뜄뜠뜼띘띴
21땅땡땽떙떵뗑뗭똉똥뙁뙝뙹뚕뚱뛍뛩뜅뜡뜽띙띵
22땆땢땾떚떶뗒뗮똊똦뙂뙞뙺뚖뚲뛎뛪뜆뜢뜾띚띶
23땇땣땿떛떷뗓뗯똋똧뙃뙟뙻뚗뚳뛏뛫뜇뜣뜿띛띷
24땈땤떀떜떸뗔뗰똌똨뙄뙠뙼뚘뚴뛐뛬뜈뜤띀띜띸
25땉땥떁떝떹뗕뗱똍똩뙅뙡뙽뚙뚵뛑뛭뜉뜥띁띝띹
26땊땦떂떞떺뗖뗲똎똪뙆뙢뙾뚚뚶뛒뛮뜊뜦띂띞띺
27땋땧떃떟떻뗗뗳똏똫뙇뙣뙿뚛뚷뛓뛯뜋뜧띃띟띻

00라래랴럐러레려례로롸뢔뢰료루뤄뤠뤼류르릐리
01락랙략럑럭렉력롁록롹뢕뢱룍룩뤅뤡뤽륙륵릑릭
02띾랚랶럒럮렊렦롂롞롺뢖뢲룎룪뤆뤢뤾륚륶릒릮
03띿랛랷럓럯렋렧롃롟롻뢗뢳룏룫뤇뤣뤿륛륷릓릯
04란랜랸럔런렌련롄론롼뢘뢴룐룬뤈뤤륀륜른릔린
05랁랝랹럕럱렍렩롅롡롽뢙뢵룑룭뤉뤥륁륝륹릕릱
06랂랞랺럖럲렎렪롆롢롾뢚뢶룒룮뤊뤦륂륞륺릖릲
07랃랟랻럗럳렏렫롇롣롿뢛뢷룓룯뤋뤧륃륟륻릗릳
08랄랠랼럘럴렐렬롈롤뢀뢜뢸룔룰뤌뤨륄률를릘릴
09랅랡랽럙럵렑렭롉롥뢁뢝뢹룕룱뤍뤩륅륡륽릙릵
10랆랢랾럚럶렒렮롊롦뢂뢞뢺룖룲뤎뤪륆륢륾릚릶
11랇랣랿럛럷렓렯롋롧뢃뢟뢻룗룳뤏뤫륇륣륿릛릷
12랈랤럀럜럸렔렰롌롨뢄뢠뢼룘룴뤐뤬륈륤릀릜릸
13랉랥럁럝럹렕렱롍롩뢅뢡뢽룙룵뤑뤭륉륥릁릝릹
14랊랦럂럞럺렖렲롎롪뢆뢢뢾룚룶뤒뤮륊륦릂릞릺
15랋랧럃럟럻렗렳롏롫뢇뢣뢿룛룷뤓뤯륋륧릃릟릻
16람램럄럠럼렘렴롐롬뢈뢤룀룜룸뤔뤰륌륨름릠림
17랍랩럅럡럽렙렵롑롭뢉뢥룁룝룹뤕뤱륍륩릅릡립
18랎랪럆럢럾렚렶롒롮뢊뢦룂룞룺뤖뤲륎륪릆릢릾
19랏랫럇럣럿렛렷롓롯뢋뢧룃룟룻뤗뤳륏륫릇릣릿
20랐랬럈럤렀렜렸롔롰뢌뢨룄룠룼뤘뤴륐륬릈릤맀
21랑랭량럥렁렝령롕롱뢍뢩룅룡룽뤙뤵륑륭릉릥링
22랒랮럊럦렂렞렺롖롲뢎뢪룆룢룾뤚뤶륒륮릊릦맂
23랓랯럋럧렃렟렻롗롳뢏뢫룇룣룿뤛뤷륓륯릋릧맃
24랔랰럌럨렄렠렼롘롴뢐뢬룈룤뤀뤜뤸륔륰릌릨맄
25랕랱럍럩렅렡렽롙롵뢑뢭룉룥뤁뤝뤹륕륱릍릩맅
26랖랲럎럪렆렢렾롚롶뢒뢮룊룦뤂뤞뤺륖륲릎릪맆
27랗랳럏럫렇렣렿롛롷뢓뢯룋룧뤃뤟뤻륗륳릏릫맇

00마매먀먜머메며몌모뫄뫠뫼묘무뭐뭬뮈뮤므믜미
01막맥먁먝먹멕멱몍목뫅뫡뫽묙묵뭑뭭뮉뮥믁믝믹
02맊맦먂먞먺멖멲몎몪뫆뫢뫾묚묶뭒뭮뮊뮦믂믞믺
03맋맧먃먟먻멗멳몏몫뫇뫣뫿묛묷뭓뭯뮋뮧믃믟믻
04만맨먄먠먼멘면몐몬뫈뫤묀묜문뭔뭰뮌뮨믄믠민
05맍맩먅먡먽멙멵몑몭뫉뫥묁묝묹뭕뭱뮍뮩믅믡믽
06많맪먆먢먾멚멶몒몮뫊뫦묂묞묺뭖뭲뮎뮪믆믢믾
07맏맫먇먣먿멛멷몓몯뫋뫧묃묟묻뭗뭳뮏뮫믇믣믿
08말맬먈먤멀멜멸몔몰뫌뫨묄묠물뭘뭴뮐뮬믈믤밀
09맑맭먉먥멁멝멹몕몱뫍뫩묅묡묽뭙뭵뮑뮭믉믥밁
10맒맮먊먦멂멞멺몖몲뫎뫪묆묢묾뭚뭶뮒뮮믊믦밂
11맓맯먋먧멃멟멻몗몳뫏뫫묇묣묿뭛뭷뮓뮯믋믧밃
12맔맰먌먨멄멠멼몘몴뫐뫬묈묤뭀뭜뭸뮔뮰믌믨밄
13맕맱먍먩멅멡멽몙몵뫑뫭묉묥뭁뭝뭹뮕뮱믍믩밅
14맖맲먎먪멆멢멾몚몶뫒뫮묊묦뭂뭞뭺뮖뮲믎믪밆
15맗맳먏먫멇멣멿몛몷뫓뫯묋묧뭃뭟뭻뮗뮳믏믫밇
16맘맴먐먬멈멤몀몜몸뫔뫰묌묨뭄뭠뭼뮘뮴믐믬밈
17맙맵먑먭멉멥몁몝몹뫕뫱묍묩뭅뭡뭽뮙뮵믑믭밉
18맚맶먒먮멊멦몂몞몺뫖뫲묎묪뭆뭢뭾뮚뮶믒믮밊
19맛맷먓먯멋멧몃몟못뫗뫳묏묫뭇뭣뭿뮛뮷믓믯밋
20맜맸먔먰멌멨몄몠몼뫘뫴묐묬뭈뭤뮀뮜뮸믔믰밌
21망맹먕먱멍멩명몡몽뫙뫵묑묭뭉뭥뮁뮝뮹믕믱밍
22맞맺먖먲멎멪몆몢몾뫚뫶묒묮뭊뭦뮂뮞뮺믖믲밎
23맟맻먗먳멏멫몇몣몿뫛뫷묓묯뭋뭧뮃뮟뮻믗믳및
24맠맼먘먴멐멬몈몤뫀뫜뫸묔묰뭌뭨뮄뮠뮼믘믴밐
25맡맽먙먵멑멭몉몥뫁뫝뫹묕묱뭍뭩뮅뮡뮽믙믵밑
26맢맾먚먶멒멮몊몦뫂뫞뫺묖묲뭎뭪뮆뮢뮾믚믶밒
27맣맿먛먷멓멯몋몧뫃뫟뫻묗묳뭏뭫뮇뮣뮿믛믷밓

00바배뱌뱨버베벼볘보봐봬뵈뵤부붜붸뷔뷰브븨비
01박백뱍뱩벅벡벽볙복봑봭뵉뵥북붝붹뷕뷱븍븩빅
02밖밲뱎뱪벆벢벾볚볶봒봮뵊뵦붂붞붺뷖뷲븎븪빆
03밗밳뱏뱫벇벣벿볛볷봓봯뵋뵧붃붟붻뷗뷳븏븫빇
04반밴뱐뱬번벤변볜본봔봰뵌뵨분붠붼뷘뷴븐븬빈
05밙밵뱑뱭벉벥볁볝볹봕봱뵍뵩붅붡붽뷙뷵븑븭빉
06밚밶뱒뱮벊벦볂볞볺봖봲뵎뵪붆붢붾뷚뷶븒븮빊
07받밷뱓뱯벋벧볃볟볻봗봳뵏뵫붇붣붿뷛뷷븓븯빋
08발밸뱔뱰벌벨별볠볼봘봴뵐뵬불붤뷀뷜뷸블븰빌
09밝밹뱕뱱벍벩볅볡볽봙봵뵑뵭붉붥뷁뷝뷹븕븱빍
10밞밺뱖뱲벎벪볆볢볾봚봶뵒뵮붊붦뷂뷞뷺븖븲빎
11밟밻뱗뱳벏벫볇볣볿봛봷뵓뵯붋붧뷃뷟뷻븗븳빏
12밠밼뱘뱴벐벬볈볤봀봜봸뵔뵰붌붨뷄뷠뷼븘븴빐
13밡밽뱙뱵벑벭볉볥봁봝봹뵕뵱붍붩뷅뷡뷽븙븵빑
14밢밾뱚뱶벒벮볊볦봂봞봺뵖뵲붎붪뷆뷢뷾븚븶빒
15밣밿뱛뱷벓벯볋볧봃봟봻뵗뵳붏붫뷇뷣뷿븛븷빓
16밤뱀뱜뱸범벰볌볨봄봠봼뵘뵴붐붬뷈뷤븀븜븸빔
17밥뱁뱝뱹법벱볍볩봅봡봽뵙뵵붑붭뷉뷥븁븝븹빕
18밦뱂뱞뱺벖벲볎볪봆봢봾뵚뵶붒붮뷊뷦븂븞븺빖
19밧뱃뱟뱻벗벳볏볫봇봣봿뵛뵷붓붯뷋뷧븃븟븻빗
20밨뱄뱠뱼벘벴볐볬봈봤뵀뵜뵸붔붰뷌뷨븄븠븼빘
21방뱅뱡뱽벙벵병볭봉봥뵁뵝뵹붕붱뷍뷩븅븡븽빙
22밪뱆뱢뱾벚벶볒볮봊봦뵂뵞뵺붖붲뷎뷪븆븢븾빚
23밫뱇뱣뱿벛벷볓볯봋봧뵃뵟뵻붗붳뷏뷫븇븣븿빛
24밬뱈뱤벀벜벸볔볰봌봨뵄뵠뵼붘붴뷐뷬븈븤빀빜
25밭뱉뱥벁벝벹볕볱봍봩뵅뵡뵽붙붵뷑뷭븉븥빁빝
26밮뱊뱦벂벞벺볖볲봎봪뵆뵢뵾붚붶뷒뷮븊븦빂빞
27밯뱋뱧벃벟벻볗볳봏봫뵇뵣뵿붛붷뷓뷯븋븧빃빟

00빠빼뺘뺴뻐뻬뼈뼤뽀뽜뽸뾔뾰뿌뿨쀄쀠쀼쁘쁴삐
01빡빽뺙뺵뻑뻭뼉뼥뽁뽝뽹뾕뾱뿍뿩쀅쀡쀽쁙쁵삑
02빢빾뺚뺶뻒뻮뼊뼦뽂뽞뽺뾖뾲뿎뿪쀆쀢쀾쁚쁶삒
03빣빿뺛뺷뻓뻯뼋뼧뽃뽟뽻뾗뾳뿏뿫쀇쀣쀿쁛쁷삓
04빤뺀뺜뺸뻔뻰뼌뼨뽄뽠뽼뾘뾴뿐뿬쀈쀤쁀쁜쁸삔
05빥뺁뺝뺹뻕뻱뼍뼩뽅뽡뽽뾙뾵뿑뿭쀉쀥쁁쁝쁹삕
06빦뺂뺞뺺뻖뻲뼎뼪뽆뽢뽾뾚뾶뿒뿮쀊쀦쁂쁞쁺삖
07빧뺃뺟뺻뻗뻳뼏뼫뽇뽣뽿뾛뾷뿓뿯쀋쀧쁃쁟쁻삗
08빨뺄뺠뺼뻘뻴뼐뼬뽈뽤뾀뾜뾸뿔뿰쀌쀨쁄쁠쁼삘
09빩뺅뺡뺽뻙뻵뼑뼭뽉뽥뾁뾝뾹뿕뿱쀍쀩쁅쁡쁽삙
10빪뺆뺢뺾뻚뻶뼒뼮뽊뽦뾂뾞뾺뿖뿲쀎쀪쁆쁢쁾삚
11빫뺇뺣뺿뻛뻷뼓뼯뽋뽧뾃뾟뾻뿗뿳쀏쀫쁇쁣쁿삛
12빬뺈뺤뻀뻜뻸뼔뼰뽌뽨뾄뾠뾼뿘뿴쀐쀬쁈쁤삀삜
13빭뺉뺥뻁뻝뻹뼕뼱뽍뽩뾅뾡뾽뿙뿵쀑쀭쁉쁥삁삝
14빮뺊뺦뻂뻞뻺뼖뼲뽎뽪뾆뾢뾾뿚뿶쀒쀮쁊쁦삂삞
15빯뺋뺧뻃뻟뻻뼗뼳뽏뽫뾇뾣뾿뿛뿷쀓쀯쁋쁧삃삟
16빰뺌뺨뻄뻠뻼뼘뼴뽐뽬뾈뾤뿀뿜뿸쀔쀰쁌쁨삄삠
17빱뺍뺩뻅뻡뻽뼙뼵뽑뽭뾉뾥뿁뿝뿹쀕쀱쁍쁩삅삡
18빲뺎뺪뻆뻢뻾뼚뼶뽒뽮뾊뾦뿂뿞뿺쀖쀲쁎쁪삆삢
19빳뺏뺫뻇뻣뻿뼛뼷뽓뽯뾋뾧뿃뿟뿻쀗쀳쁏쁫삇삣
20빴뺐뺬뻈뻤뼀뼜뼸뽔뽰뾌뾨뿄뿠뿼쀘쀴쁐쁬삈삤
21빵뺑뺭뻉뻥뼁뼝뼹뽕뽱뾍뾩뿅뿡뿽쀙쀵쁑쁭삉삥
22빶뺒뺮뻊뻦뼂뼞뼺뽖뽲뾎뾪뿆뿢뿾쀚쀶쁒쁮삊삦
23빷뺓뺯뻋뻧뼃뼟뼻뽗뽳뾏뾫뿇뿣뿿쀛쀷쁓쁯삋삧
24빸뺔뺰뻌뻨뼄뼠뼼뽘뽴뾐뾬뿈뿤쀀쀜쀸쁔쁰삌삨
25빹뺕뺱뻍뻩뼅뼡뼽뽙뽵뾑뾭뿉뿥쀁쀝쀹쁕쁱삍삩
26빺뺖뺲뻎뻪뼆뼢뼾뽚뽶뾒뾮뿊뿦쀂쀞쀺쁖쁲삎삪
27빻뺗뺳뻏뻫뼇뼣뼿뽛뽷뾓뾯뿋뿧쀃쀟쀻쁗쁳삏삫

00사새샤섀서세셔셰소솨쇄쇠쇼수숴쉐쉬슈스싀시
01삭색샥섁석섹셕셱속솩쇅쇡쇽숙숵쉑쉭슉슥싁식
02삮샊샦섂섞섺셖셲솎솪쇆쇢쇾숚숶쉒쉮슊슦싂싞
03삯샋샧섃섟섻셗셳솏솫쇇쇣쇿숛숷쉓쉯슋슧싃싟
04산샌샨섄선센션셴손솬쇈쇤숀순숸쉔쉰슌슨싄신
05삱샍샩섅섡섽셙셵솑솭쇉쇥숁숝숹쉕쉱슍슩싅싡
06삲샎샪섆섢섾셚셶솒솮쇊쇦숂숞숺쉖쉲슎슪싆싢
07삳샏샫섇섣섿셛셷솓솯쇋쇧숃숟숻쉗쉳슏슫싇싣
08살샐샬섈설셀셜셸솔솰쇌쇨숄술숼쉘쉴슐슬싈실
09삵샑샭섉섥셁셝셹솕솱쇍쇩숅숡숽쉙쉵슑슭싉싥
10삶샒샮섊섦셂셞셺솖솲쇎쇪숆숢숾쉚쉶슒슮싊싦
11삷샓샯섋섧셃셟셻솗솳쇏쇫숇숣숿쉛쉷슓슯싋싧
12삸샔샰섌섨셄셠셼솘솴쇐쇬숈숤쉀쉜쉸슔슰싌싨
13삹샕샱섍섩셅셡셽솙솵쇑쇭숉숥쉁쉝쉹슕슱싍싩
14삺샖샲섎섪셆셢셾솚솶쇒쇮숊숦쉂쉞쉺슖슲싎싪
15삻샗샳섏섫셇셣셿솛솷쇓쇯숋숧쉃쉟쉻슗슳싏싫
16삼샘샴섐섬셈셤솀솜솸쇔쇰숌숨쉄쉠쉼슘슴싐심
17삽샙샵섑섭셉셥솁솝솹쇕쇱숍숩쉅쉡쉽슙습싑십
18삾샚샶섒섮셊셦솂솞솺쇖쇲숎숪쉆쉢쉾슚슶싒싮
19삿샛샷섓섯셋셧솃솟솻쇗쇳숏숫쉇쉣쉿슛슷싓싯
20샀샜샸섔섰셌셨솄솠솼쇘쇴숐숬쉈쉤슀슜슸싔싰
21상생샹섕성셍셩솅송솽쇙쇵숑숭쉉쉥슁슝승싕싱
22샂샞샺섖섲셎셪솆솢솾쇚쇶숒숮쉊쉦슂슞슺싖싲
23샃샟샻섗섳셏셫솇솣솿쇛쇷숓숯쉋쉧슃슟슻싗싳
24샄샠샼섘섴셐셬솈솤쇀쇜쇸숔숰쉌쉨슄슠슼싘싴
25샅샡샽섙섵셑셭솉솥쇁쇝쇹숕숱쉍쉩슅슡슽싙싵
26샆샢샾섚섶셒셮솊솦쇂쇞쇺숖숲쉎쉪슆슢슾싚싶
27샇샣샿섛섷셓셯솋솧쇃쇟쇻숗숳쉏쉫슇슣슿싛싷

00싸쌔쌰썌써쎄쎠쎼쏘쏴쐐쐬쑈쑤쒀쒜쒸쓔쓰씌씨
01싹쌕쌱썍썩쎅쎡쎽쏙쏵쐑쐭쑉쑥쒁쒝쒹쓕쓱씍씩
02싺쌖쌲썎썪쎆쎢쎾쏚쏶쐒쐮쑊쑦쒂쒞쒺쓖쓲씎씪
03싻쌗쌳썏썫쎇쎣쎿쏛쏷쐓쐯쑋쑧쒃쒟쒻쓗쓳씏씫
04싼쌘쌴썐썬쎈쎤쏀쏜쏸쐔쐰쑌쑨쒄쒠쒼쓘쓴씐씬
05싽쌙쌵썑썭쎉쎥쏁쏝쏹쐕쐱쑍쑩쒅쒡쒽쓙쓵씑씭
06싾쌚쌶썒썮쎊쎦쏂쏞쏺쐖쐲쑎쑪쒆쒢쒾쓚쓶씒씮
07싿쌛쌷썓썯쎋쎧쏃쏟쏻쐗쐳쑏쑫쒇쒣쒿쓛쓷씓씯
08쌀쌜쌸썔썰쎌쎨쏄쏠쏼쐘쐴쑐쑬쒈쒤쓀쓜쓸씔씰
09쌁쌝쌹썕썱쎍쎩쏅쏡쏽쐙쐵쑑쑭쒉쒥쓁쓝쓹씕씱
10쌂쌞쌺썖썲쎎쎪쏆쏢쏾쐚쐶쑒쑮쒊쒦쓂쓞쓺씖씲
11쌃쌟쌻썗썳쎏쎫쏇쏣쏿쐛쐷쑓쑯쒋쒧쓃쓟쓻씗씳
12쌄쌠쌼썘썴쎐쎬쏈쏤쐀쐜쐸쑔쑰쒌쒨쓄쓠쓼씘씴
13쌅쌡쌽썙썵쎑쎭쏉쏥쐁쐝쐹쑕쑱쒍쒩쓅쓡쓽씙씵
14쌆쌢쌾썚썶쎒쎮쏊쏦쐂쐞쐺쑖쑲쒎쒪쓆쓢쓾씚씶
15쌇쌣쌿썛썷쎓쎯쏋쏧쐃쐟쐻쑗쑳쒏쒫쓇쓣쓿씛씷
16쌈쌤썀썜썸쎔쎰쏌쏨쐄쐠쐼쑘쑴쒐쒬쓈쓤씀씜씸
17쌉쌥썁썝썹쎕쎱쏍쏩쐅쐡쐽쑙쑵쒑쒭쓉쓥씁씝씹
18쌊쌦썂썞썺쎖쎲쏎쏪쐆쐢쐾쑚쑶쒒쒮쓊쓦씂씞씺
19쌋쌧썃썟썻쎗쎳쏏쏫쐇쐣쐿쑛쑷쒓쒯쓋쓧씃씟씻
20쌌쌨썄썠썼쎘쎴쏐쏬쐈쐤쑀쑜쑸쒔쒰쓌쓨씄씠씼
21쌍쌩썅썡썽쎙쎵쏑쏭쐉쐥쑁쑝쑹쒕쒱쓍쓩씅씡씽
22쌎쌪썆썢썾쎚쎶쏒쏮쐊쐦쑂쑞쑺쒖쒲쓎쓪씆씢씾
23쌏쌫썇썣썿쎛쎷쏓쏯쐋쐧쑃쑟쑻쒗쒳쓏쓫씇씣씿
24쌐쌬썈썤쎀쎜쎸쏔쏰쐌쐨쑄쑠쑼쒘쒴쓐쓬씈씤앀
25쌑쌭썉썥쎁쎝쎹쏕쏱쐍쐩쑅쑡쑽쒙쒵쓑쓭씉씥앁
26쌒쌮썊썦쎂쎞쎺쏖쏲쐎쐪쑆쑢쑾쒚쒶쓒쓮씊씦앂
27쌓쌯썋썧쎃쎟쎻쏗쏳쐏쐫쑇쑣쑿쒛쒷쓓쓯씋씧앃

00아애야얘어에여예오와왜외요우워웨위유으의이
01악액약얙억엑역옉옥왁왝왹욕욱웍웩윅육윽읙익
02앆앢앾얚얶엒엮옊옦왂왞왺욖욲웎웪윆윢윾읚읶
03앇앣앿얛얷엓엯옋옧왃왟왻욗욳웏웫윇윣윿읛읷
04안앤얀얜언엔연옌온완왠왼욘운원웬윈윤은읜인
05앉앥얁얝얹엕엱옍옩왅왡왽욙욵웑웭윉윥읁읝읹
06않앦얂얞얺엖엲옎옪왆왢왾욚욶웒웮윊윦읂읞읺
07앋앧얃얟얻엗엳옏옫왇왣왿욛욷웓웯윋윧읃읟읻
08알앨얄얠얼엘열옐올왈왤욀욜울월웰윌율을읠일
09앍앩얅얡얽엙엵옑옭왉왥욁욝욹웕웱윍윩읅읡읽
10앎앪얆얢얾엚엶옒옮왊왦욂욞욺웖웲윎윪읆읢읾
11앏앫얇얣얿엛엷옓옯왋왧욃욟욻웗웳윏윫읇읣읿
12앐앬얈얤엀엜엸옔옰왌왨욄욠욼웘웴윐윬읈읤잀
13앑앭얉얥엁엝엹옕옱왍왩욅욡욽웙웵윑윭읉읥잁
14앒앮얊얦엂엞엺옖옲왎왪욆욢욾웚웶윒윮읊읦잂
15앓앯얋얧엃엟엻옗옳왏왫욇욣욿웛웷윓윯읋읧잃
16암앰얌얨엄엠염옘옴왐왬욈욤움웜웸윔윰음읨임
17압앱얍얩업엡엽옙옵왑왭욉욥웁웝웹윕윱읍읩입
18앖앲얎얪없엢엾옚옶왒왮욊욦웂웞웺윖윲읎읪잆
19앗앳얏얫엇엣엿옛옷왓왯욋욧웃웟웻윗윳읏읫잇
20았앴얐얬었엤였옜옸왔왰욌욨웄웠웼윘윴읐읬있
21앙앵양얭엉엥영옝옹왕왱욍용웅웡웽윙융응읭잉
22앚앶얒얮엊엦옂옞옺왖왲욎욪웆웢웾윚윶읒읮잊
23앛앷얓얯엋엧옃옟옻왗왳욏욫웇웣웿윛윷읓읯잋
24앜앸얔얰엌엨옄옠옼왘왴욐욬웈웤윀윜윸읔읰잌
25앝앹얕얱엍엩옅옡옽왙왵욑욭웉웥윁윝윹읕읱잍
26앞앺얖얲엎엪옆옢옾왚왶욒욮웊웦윂윞윺읖읲잎
27앟앻얗얳엏엫옇옣옿왛왷욓욯웋웧윃윟윻읗읳잏

00자재쟈쟤저제져졔조좌좨죄죠주줘줴쥐쥬즈즤지
01작잭쟉쟥적젝젹졕족좍좩죅죡죽줙줵쥑쥭즉즥직
02잒잮쟊쟦젂젞젺졖졲좎좪죆죢죾줚줶쥒쥮즊즦짂
03잓잯쟋쟧젃젟젻졗졳좏좫죇죣죿줛줷쥓쥯즋즧짃
04잔잰쟌쟨전젠젼졘존좐좬죈죤준줜줸쥔쥰즌즨진
05잕잱쟍쟩젅젡젽졙졵좑좭죉죥줁줝줹쥕쥱즍즩짅
06잖잲쟎쟪젆젢젾졚졶좒좮죊죦줂줞줺쥖쥲즎즪짆
07잗잳쟏쟫젇젣젿졛졷좓좯죋죧줃줟줻쥗쥳즏즫짇
08잘잴쟐쟬절젤졀졜졸좔좰죌죨줄줠줼쥘쥴즐즬질
09잙잵쟑쟭젉젥졁졝졹좕좱죍죩줅줡줽쥙쥵즑즭짉
10잚잶쟒쟮젊젦졂졞졺좖좲죎죪줆줢줾쥚쥶즒즮짊
11잛잷쟓쟯젋젧졃졟졻좗좳죏죫줇줣줿쥛쥷즓즯짋
12잜잸쟔쟰젌젨졄졠졼좘좴죐죬줈줤쥀쥜쥸즔즰짌
13잝잹쟕쟱젍젩졅졡졽좙좵죑죭줉줥쥁쥝쥹즕즱짍
14잞잺쟖쟲젎젪졆졢졾좚좶죒죮줊줦쥂쥞쥺즖즲짎
15잟잻쟗쟳젏젫졇졣졿좛좷죓죯줋줧쥃쥟쥻즗즳짏
16잠잼쟘쟴점젬졈졤좀좜좸죔죰줌줨쥄쥠쥼즘즴짐
17잡잽쟙쟵접젭졉졥좁좝좹죕죱줍줩쥅쥡쥽즙즵집
18잢잾쟚쟶젒젮졊졦좂좞좺죖죲줎줪쥆쥢쥾즚즶짒
19잣잿쟛쟷젓젯졋졧좃좟좻죗죳줏줫쥇쥣쥿즛즷짓
20잤쟀쟜쟸젔젰졌졨좄좠좼죘죴줐줬쥈쥤즀즜즸짔
21장쟁쟝쟹정젱졍졩종좡좽죙죵중줭쥉쥥즁증즹징
22잦쟂쟞쟺젖젲졎졪좆좢좾죚죶줒줮쥊쥦즂즞즺짖
23잧쟃쟟쟻젗젳졏졫좇좣좿죛죷줓줯쥋쥧즃즟즻짗
24잨쟄쟠쟼젘젴졐졬좈좤죀죜죸줔줰쥌쥨즄즠즼짘
25잩쟅쟡쟽젙젵졑졭좉좥죁죝죹줕줱쥍쥩즅즡즽짙
26잪쟆쟢쟾젚젶졒졮좊좦죂죞죺줖줲쥎쥪즆즢즾짚
27잫쟇쟣쟿젛젷졓졯좋좧죃죟죻줗줳쥏쥫즇즣즿짛

00짜째쨔쨰쩌쩨쪄쪠쪼쫘쫴쬐쬬쭈쭤쮀쮜쮸쯔쯰찌
01짝짹쨕쨱쩍쩩쪅쪡쪽쫙쫵쬑쬭쭉쭥쮁쮝쮹쯕쯱찍
02짞짺쨖쨲쩎쩪쪆쪢쪾쫚쫶쬒쬮쭊쭦쮂쮞쮺쯖쯲찎
03짟짻쨗쨳쩏쩫쪇쪣쪿쫛쫷쬓쬯쭋쭧쮃쮟쮻쯗쯳찏
04짠짼쨘쨴쩐쩬쪈쪤쫀쫜쫸쬔쬰쭌쭨쮄쮠쮼쯘쯴찐
05짡짽쨙쨵쩑쩭쪉쪥쫁쫝쫹쬕쬱쭍쭩쮅쮡쮽쯙쯵찑
06짢짾쨚쨶쩒쩮쪊쪦쫂쫞쫺쬖쬲쭎쭪쮆쮢쮾쯚쯶찒
07짣짿쨛쨷쩓쩯쪋쪧쫃쫟쫻쬗쬳쭏쭫쮇쮣쮿쯛쯷찓
08짤쨀쨜쨸쩔쩰쪌쪨쫄쫠쫼쬘쬴쭐쭬쮈쮤쯀쯜쯸찔
09짥쨁쨝쨹쩕쩱쪍쪩쫅쫡쫽쬙쬵쭑쭭쮉쮥쯁쯝쯹찕
10짦쨂쨞쨺쩖쩲쪎쪪쫆쫢쫾쬚쬶쭒쭮쮊쮦쯂쯞쯺찖
11짧쨃쨟쨻쩗쩳쪏쪫쫇쫣쫿쬛쬷쭓쭯쮋쮧쯃쯟쯻찗
12짨쨄쨠쨼쩘쩴쪐쪬쫈쫤쬀쬜쬸쭔쭰쮌쮨쯄쯠쯼찘
13짩쨅쨡쨽쩙쩵쪑쪭쫉쫥쬁쬝쬹쭕쭱쮍쮩쯅쯡쯽찙
14짪쨆쨢쨾쩚쩶쪒쪮쫊쫦쬂쬞쬺쭖쭲쮎쮪쯆쯢쯾찚
15짫쨇쨣쨿쩛쩷쪓쪯쫋쫧쬃쬟쬻쭗쭳쮏쮫쯇쯣쯿찛
16짬쨈쨤쩀쩜쩸쪔쪰쫌쫨쬄쬠쬼쭘쭴쮐쮬쯈쯤찀찜
17짭쨉쨥쩁쩝쩹쪕쪱쫍쫩쬅쬡쬽쭙쭵쮑쮭쯉쯥찁찝
18짮쨊쨦쩂쩞쩺쪖쪲쫎쫪쬆쬢쬾쭚쭶쮒쮮쯊쯦찂찞
19짯쨋쨧쩃쩟쩻쪗쪳쫏쫫쬇쬣쬿쭛쭷쮓쮯쯋쯧찃찟
20짰쨌쨨쩄쩠쩼쪘쪴쫐쫬쬈쬤쭀쭜쭸쮔쮰쯌쯨찄찠
21짱쨍쨩쩅쩡쩽쪙쪵쫑쫭쬉쬥쭁쭝쭹쮕쮱쯍쯩찅찡
22짲쨎쨪쩆쩢쩾쪚쪶쫒쫮쬊쬦쭂쭞쭺쮖쮲쯎쯪찆찢
23짳쨏쨫쩇쩣쩿쪛쪷쫓쫯쬋쬧쭃쭟쭻쮗쮳쯏쯫찇찣
24짴쨐쨬쩈쩤쪀쪜쪸쫔쫰쬌쬨쭄쭠쭼쮘쮴쯐쯬찈찤
25짵쨑쨭쩉쩥쪁쪝쪹쫕쫱쬍쬩쭅쭡쭽쮙쮵쯑쯭찉찥
26짶쨒쨮쩊쩦쪂쪞쪺쫖쫲쬎쬪쭆쭢쭾쮚쮶쯒쯮찊찦
27짷쨓쨯쩋쩧쪃쪟쪻쫗쫳쬏쬫쭇쭣쭿쮛쮷쯓쯯찋찧

00차채챠챼처체쳐쳬초촤쵀최쵸추춰췌취츄츠츼치
01착책챡챽척첵쳑쳭촉촥쵁쵝쵹축춱췍췩츅측츽칙
02찪챆챢챾첚첶쳒쳮촊촦쵂쵞쵺춖춲췎췪츆츢츾칚
03찫챇챣챿첛첷쳓쳯촋촧쵃쵟쵻춗춳췏췫츇츣츿칛
04찬챈챤첀천첸쳔쳰촌촨쵄쵠쵼춘춴췐췬츈츤칀친
05찭챉챥첁첝첹쳕쳱촍촩쵅쵡쵽춙춵췑췭츉츥칁칝
06찮챊챦첂첞첺쳖쳲촎촪쵆쵢쵾춚춶췒췮츊츦칂칞
07찯챋챧첃첟첻쳗쳳촏촫쵇쵣쵿춛춷췓췯츋츧칃칟
08찰챌챨첄철첼쳘쳴촐촬쵈쵤춀출춸췔췰츌츨칄칠
09찱챍챩첅첡첽쳙쳵촑촭쵉쵥춁춝춹췕췱츍츩칅칡
10찲챎챪첆첢첾쳚쳶촒촮쵊쵦춂춞춺췖췲츎츪칆칢
11찳챏챫첇첣첿쳛쳷촓촯쵋쵧춃춟춻췗췳츏츫칇칣
12찴챐챬첈첤쳀쳜쳸촔촰쵌쵨춄춠춼췘췴츐츬칈칤
13찵챑챭첉첥쳁쳝쳹촕촱쵍쵩춅춡춽췙췵츑츭칉칥
14찶챒챮첊첦쳂쳞쳺촖촲쵎쵪춆춢춾췚췶츒츮칊칦
15찷챓챯첋첧쳃쳟쳻촗촳쵏쵫춇춣춿췛췷츓츯칋칧
16참챔챰첌첨쳄쳠쳼촘촴쵐쵬춈춤췀췜췸츔츰칌침
17찹챕챱첍첩쳅쳡쳽촙촵쵑쵭춉춥췁췝췹츕츱칍칩
18찺챖챲첎첪쳆쳢쳾촚촶쵒쵮춊춦췂췞췺츖츲칎칪
19찻챗챳첏첫쳇쳣쳿촛촷쵓쵯춋춧췃췟췻츗츳칏칫
20찼챘챴첐첬쳈쳤촀촜촸쵔쵰춌춨췄췠췼츘츴칐칬
21창챙챵첑청쳉쳥촁총촹쵕쵱춍충췅췡췽츙층칑칭
22찾챚챶첒첮쳊쳦촂촞촺쵖쵲춎춪췆췢췾츚츶칒칮
23찿챛챷첓첯쳋쳧촃촟촻쵗쵳춏춫췇췣췿츛츷칓칯
24챀챜챸첔첰쳌쳨촄촠촼쵘쵴춐춬췈췤츀츜츸칔칰
25챁챝챹첕첱쳍쳩촅촡촽쵙쵵춑춭췉췥츁츝츹칕칱
26챂챞챺첖첲쳎쳪촆촢촾쵚쵶춒춮췊췦츂츞츺칖칲
27챃챟챻첗첳쳏쳫촇촣촿쵛쵷춓춯췋췧츃츟츻칗칳

00카캐캬컈커케켜켸코콰쾌쾨쿄쿠쿼퀘퀴큐크킈키
01칵캑캭컉컥켁켝켹콕콱쾍쾩쿅쿡쿽퀙퀵큑큭킉킥
02칶캒캮컊컦켂켞켺콖콲쾎쾪쿆쿢쿾퀚퀶큒큮킊킦
03칷캓캯컋컧켃켟켻콗콳쾏쾫쿇쿣쿿퀛퀷큓큯킋킧
04칸캔캰컌컨켄켠켼콘콴쾐쾬쿈쿤퀀퀜퀸큔큰킌킨
05칹캕캱컍컩켅켡켽콙콵쾑쾭쿉쿥퀁퀝퀹큕큱킍킩
06칺캖캲컎컪켆켢켾콚콶쾒쾮쿊쿦퀂퀞퀺큖큲킎킪
07칻캗캳컏컫켇켣켿콛콷쾓쾯쿋쿧퀃퀟퀻큗큳킏킫
08칼캘캴컐컬켈켤콀콜콸쾔쾰쿌쿨퀄퀠퀼큘클킐킬
09칽캙캵컑컭켉켥콁콝콹쾕쾱쿍쿩퀅퀡퀽큙큵킑킭
10칾캚캶컒컮켊켦콂콞콺쾖쾲쿎쿪퀆퀢퀾큚큶킒킮
11칿캛캷컓컯켋켧콃콟콻쾗쾳쿏쿫퀇퀣퀿큛큷킓킯
12캀캜캸컔컰켌켨콄콠콼쾘쾴쿐쿬퀈퀤큀큜큸킔킰
13캁캝캹컕컱켍켩콅콡콽쾙쾵쿑쿭퀉퀥큁큝큹킕킱
14캂캞캺컖컲켎켪콆콢콾쾚쾶쿒쿮퀊퀦큂큞큺킖킲
15캃캟캻컗컳켏켫콇콣콿쾛쾷쿓쿯퀋퀧큃큟큻킗킳
16캄캠캼컘컴켐켬콈콤쾀쾜쾸쿔쿰퀌퀨큄큠큼킘킴
17캅캡캽컙컵켑켭콉콥쾁쾝쾹쿕쿱퀍퀩큅큡큽킙킵
18캆캢캾컚컶켒켮콊콦쾂쾞쾺쿖쿲퀎퀪큆큢큾킚킶
19캇캣캿컛컷켓켯콋콧쾃쾟쾻쿗쿳퀏퀫큇큣큿킛킷
20캈캤컀컜컸켔켰콌콨쾄쾠쾼쿘쿴퀐퀬큈큤킀킜킸
21캉캥컁컝컹켕켱콍콩쾅쾡쾽쿙쿵퀑퀭큉큥킁킝킹
22캊캦컂컞컺켖켲콎콪쾆쾢쾾쿚쿶퀒퀮큊큦킂킞킺
23캋캧컃컟컻켗켳콏콫쾇쾣쾿쿛쿷퀓퀯큋큧킃킟킻
24캌캨컄컠컼켘켴콐콬쾈쾤쿀쿜쿸퀔퀰큌큨킄킠킼
25캍캩컅컡컽켙켵콑콭쾉쾥쿁쿝쿹퀕퀱큍큩킅킡킽
26캎캪컆컢컾켚켶콒콮쾊쾦쿂쿞쿺퀖퀲큎큪킆킢킾
27캏캫컇컣컿켛켷콓콯쾋쾧쿃쿟쿻퀗퀳큏큫킇킣킿

00타태탸턔터테텨톄토톼퇘퇴툐투퉈퉤튀튜트틔티
01탁택탹턕턱텍텩톅톡톽퇙퇵툑툭퉉퉥튁튝특틕틱
02탂탞탺턖턲텎텪톆톢톾퇚퇶툒툮퉊퉦튂튞튺틖틲
03탃탟탻턗턳텏텫톇톣톿퇛퇷툓툯퉋퉧튃튟튻틗틳
04탄탠탼턘턴텐텬톈톤퇀퇜퇸툔툰퉌퉨튄튠튼틘틴
05탅탡탽턙턵텑텭톉톥퇁퇝퇹툕툱퉍퉩튅튡튽틙틵
06탆탢탾턚턶텒텮톊톦퇂퇞퇺툖툲퉎퉪튆튢튾틚틶
07탇탣탿턛턷텓텯톋톧퇃퇟퇻툗툳퉏퉫튇튣튿틛틷
08탈탤턀턜털텔텰톌톨퇄퇠퇼툘툴퉐퉬튈튤틀틜틸
09탉탥턁턝턹텕텱톍톩퇅퇡퇽툙툵퉑퉭튉튥틁틝틹
10탊탦턂턞턺텖텲톎톪퇆퇢퇾툚툶퉒퉮튊튦틂틞틺
11탋탧턃턟턻텗텳톏톫퇇퇣퇿툛툷퉓퉯튋튧틃틟틻
12탌탨턄턠턼텘텴톐톬퇈퇤툀툜툸퉔퉰튌튨틄틠틼
13탍탩턅턡턽텙텵톑톭퇉퇥툁툝툹퉕퉱튍튩틅틡틽
14탎탪턆턢턾텚텶톒톮퇊퇦툂툞툺퉖퉲튎튪틆틢틾
15탏탫턇턣턿텛텷톓톯퇋퇧툃툟툻퉗퉳튏튫틇틣틿
16탐탬턈턤텀템텸톔톰퇌퇨툄툠툼퉘퉴튐튬틈틤팀
17탑탭턉턥텁텝텹톕톱퇍퇩툅툡툽퉙퉵튑튭틉틥팁
18탒탮턊턦텂텞텺톖톲퇎퇪툆툢툾퉚퉶튒튮틊틦팂
19탓탯턋턧텃텟텻톗톳퇏퇫툇툣툿퉛퉷튓튯틋틧팃
20탔탰턌턨텄텠텼톘톴퇐퇬툈툤퉀퉜퉸튔튰틌틨팄
21탕탱턍턩텅텡텽톙통퇑퇭툉툥퉁퉝퉹튕튱틍틩팅
22탖탲턎턪텆텢텾톚톶퇒퇮툊툦퉂퉞퉺튖튲틎틪팆
23탗탳턏턫텇텣텿톛톷퇓퇯툋툧퉃퉟퉻튗튳틏틫팇
24탘탴턐턬텈텤톀톜톸퇔퇰툌툨퉄퉠퉼튘튴틐틬팈
25탙탵턑턭텉텥톁톝톹퇕퇱툍툩퉅퉡퉽튙튵틑틭팉
26탚탶턒턮텊텦톂톞톺퇖퇲툎툪퉆퉢퉾튚튶틒틮팊
27탛탷턓턯텋텧톃톟톻퇗퇳툏툫퉇퉣퉿튛튷틓틯팋

00파패퍄퍠퍼페펴폐포퐈퐤푀표푸풔풰퓌퓨프픠피
01팍팩퍅퍡퍽펙펵폑폭퐉퐥푁푝푹풕풱퓍퓩픅픡픽
02팎팪퍆퍢퍾펚펶폒폮퐊퐦푂푞푺풖풲퓎퓪픆픢픾
03팏팫퍇퍣퍿펛펷폓폯퐋퐧푃푟푻풗풳퓏퓫픇픣픿
04판팬퍈퍤펀펜편폔폰퐌퐨푄푠푼풘풴퓐퓬픈픤핀
05팑팭퍉퍥펁펝펹폕폱퐍퐩푅푡푽풙풵퓑퓭픉픥핁
06팒팮퍊퍦펂펞펺폖폲퐎퐪푆푢푾풚풶퓒퓮픊픦핂
07팓팯퍋퍧펃펟펻폗폳퐏퐫푇푣푿풛풷퓓퓯픋픧핃
08팔팰퍌퍨펄펠펼폘폴퐐퐬푈푤풀풜풸퓔퓰플픨필
09팕팱퍍퍩펅펡펽폙폵퐑퐭푉푥풁풝풹퓕퓱픍픩핅
10팖팲퍎퍪펆펢펾폚폶퐒퐮푊푦풂풞풺퓖퓲픎픪핆
11팗팳퍏퍫펇펣펿폛폷퐓퐯푋푧풃풟풻퓗퓳픏픫핇
12팘팴퍐퍬펈펤폀폜폸퐔퐰푌푨풄풠풼퓘퓴픐픬핈
13팙팵퍑퍭펉펥폁폝폹퐕퐱푍푩풅풡풽퓙퓵픑픭핉
14팚팶퍒퍮펊펦폂폞폺퐖퐲푎푪풆풢풾퓚퓶픒픮핊
15팛팷퍓퍯펋펧폃폟폻퐗퐳푏푫풇풣풿퓛퓷픓픯핋
16팜팸퍔퍰펌펨폄폠폼퐘퐴푐푬품풤퓀퓜퓸픔픰핌
17팝팹퍕퍱펍펩폅폡폽퐙퐵푑푭풉풥퓁퓝퓹픕픱핍
18팞팺퍖퍲펎펪폆폢폾퐚퐶푒푮풊풦퓂퓞퓺픖픲핎
19팟팻퍗퍳펏펫폇폣폿퐛퐷푓푯풋풧퓃퓟퓻픗픳핏
20팠팼퍘퍴펐펬폈폤퐀퐜퐸푔푰풌풨퓄퓠퓼픘픴핐
21팡팽퍙퍵펑펭평폥퐁퐝퐹푕푱풍풩퓅퓡퓽픙픵핑
22팢팾퍚퍶펒펮폊폦퐂퐞퐺푖푲풎풪퓆퓢퓾픚픶핒
23팣팿퍛퍷펓펯폋폧퐃퐟퐻푗푳풏풫퓇퓣퓿픛픷핓
24팤퍀퍜퍸펔펰폌폨퐄퐠퐼푘푴풐풬퓈퓤픀픜픸핔
25팥퍁퍝퍹펕펱폍폩퐅퐡퐽푙푵풑풭퓉퓥픁픝픹핕
26팦퍂퍞퍺펖펲폎폪퐆퐢퐾푚푶풒풮퓊퓦픂픞픺핖
27팧퍃퍟퍻펗펳폏폫퐇퐣퐿푛푷풓풯퓋퓧픃픟픻핗

00하해햐햬허헤혀혜호화홰회효후훠훼휘휴흐희히
01학핵햑햭헉헥혁혝혹확홱획횩훅훡훽휙휵흑흭힉
02핚핶햒햮헊헦혂혞혺홖홲횎횪훆훢훾휚휶흒흮힊
03핛핷햓햯헋헧혃혟혻홗홳횏횫훇훣훿휛휷흓흯힋
04한핸햔햰헌헨현혠혼환홴횐횬훈훤휀휜휸흔흰힌
05핝핹햕햱헍헩혅혡혽홙홵횑횭훉훥휁휝휹흕흱힍
06핞핺햖햲헎헪혆혢혾홚홶횒횮훊훦휂휞휺흖흲힎
07핟핻햗햳헏헫혇혣혿홛홷횓횯훋훧휃휟휻흗흳힏
08할핼햘햴헐헬혈혤홀활홸횔횰훌훨휄휠휼흘흴힐
09핡핽햙햵헑헭혉혥홁홝홹횕횱훍훩휅휡휽흙흵힑
10핢핾햚햶헒헮혊혦홂홞홺횖횲훎훪휆휢휾흚흶힒
11핣핿햛햷헓헯혋혧홃홟홻횗횳훏훫휇휣휿흛흷힓
12핤햀햜햸헔헰혌혨홄홠홼횘횴훐훬휈휤흀흜흸힔
13핥햁햝햹헕헱혍혩홅홡홽횙횵훑훭휉휥흁흝흹힕
14핦햂햞햺헖헲혎혪홆홢홾횚횶훒훮휊휦흂흞흺힖
15핧햃햟햻헗헳혏혫홇홣홿횛횷훓훯휋휧흃흟흻힗
16함햄햠햼험헴혐혬홈홤횀횜횸훔훰휌휨흄흠흼힘
17합햅햡햽헙헵협혭홉홥횁횝횹훕훱휍휩흅흡흽힙
18핪햆햢햾헚헶혒혮홊홦횂횞횺훖훲휎휪흆흢흾힚
19핫햇햣햿헛헷혓혯홋홧횃횟횻훗훳휏휫흇흣흿힛
20핬했햤헀헜헸혔혰홌홨횄횠횼훘훴휐휬흈흤힀힜
21항행향헁헝헹형혱홍황횅횡횽훙훵휑휭흉흥힁힝
22핮햊햦헂헞헺혖혲홎홪횆횢횾훚훶휒휮흊흦힂힞
23핯햋햧헃헟헻혗혳홏홫횇횣횿훛훷휓휯흋흧힃힟
24핰햌햨헄헠헼혘혴홐홬횈횤훀훜훸휔휰흌흨힄힠
25핱햍햩헅헡헽혙혵홑홭횉횥훁훝훹휕휱흍흩힅힡
26핲햎햪헆헢헾혚혶홒홮횊횦훂훞훺휖휲흎흪힆힢
27핳햏햫헇헣헿혛혷홓홯횋횧훃훟훻휗휳흏흫힇힣



2015년 6월 15일 월요일

왜곡 불가능 문자 만들기

숫자를 왜곡하면 심각하겠지? 일(一), 이(二), 삼(三)이 왜곡하기 쉬워서 일(壹), 이(貳), 삼(參)으로 쓰던 옛 시대를 생각하면 우습다. 어떤 문자가 획을 추가해서 다른 문자가 되는 경우는 왜곡이 쉽다. 1↔4, 3↔8의 경우도 외곡하기 쉽다. 한글의 어↔이↔아는 1획 차이로 왜곡 가능하다. 

우리가 쓰는 아라비아 숫자는 원래 인도에서 건너간 것이다. 몇 백 년 전에는 중국, 인도가 지금의 미국, 유럽과 같은 위치였단다. 앞으로 몇 십 년 후면 그렇게 될 것이다. 모셔야 할 강대국이 2개 더 늘겠다.

중국과 인도의 수학, 천문학은 농업, 상업에 비례해서 매우 발달했다. 그러니 당연히 숫자의 표현도 발달했다. 엄청 큰 수를 표현할 수도 있고, 큰 수를 계산하기 편한 자릿수 개념도 생겼다. 계산을 돕는 주판도 발달했다. 거기에 비하면 영어, 한국어, 일본어의 숫자 표현은 솔직히 석기 시대 수준이다.


1. 토폴로지(위상학)


● : 점, 덩어리, 교차로 등 고리를 형성하지 못 한 것
○ : 고리, 폐곡선을 형성한 것

글자의 모양에서 고리가 있느냐 없느냐로 구분할 수 있다. 이게 원래는 길 찾기 문제를 풀기 위해 고안한 수학이다. 문자에서 고리 형상이 몇 개 들어 갈 수 있는지 정한다. 0469는 고리 1개, 8은 고리 2개, 12357은 고리가 없다.

이처럼 고리의 개수, 위치 + 교차점의 개수, 위치 + 가로/세로/대각 획으로 조합할 수도 있다. 무수히 많은 조합이 가능하기 때문에 얼마든지 왜곡 불가능한 문자를 쉽게 만들 수 있다. 흔히 볼 수 있는 것이 고리에선 동그라미(OQDBPR), 사각형(口日目田), 삼각형(A) 등이다. 교차점에선 십자(十X)이고, 획 조합에선 TYHEFKVWZNML 등 많다. 1이나 I나 一 같은 1획 문자는 쓰면 안 된다. 열린 곡선 CGS 등은 단순해서 읽기 쉽지만 일본 히라가나 문자처럼 만들면 읽기 정말 힘들어진다.


2. 획 조합


보통 전자 회로에서 숫자를 나타내기 위해 쓰는 7세그먼트는 7획으로 된 숫자 표현이다. 고리는 2개까지 들어갈 수 있다. 이 7획에서 3 또는 4획을 뽑아 Combination조합하는 경우 35개로 가장 많은 문자를 만들 수 있고, 왜곡이 불가능하다. 왜냐하면 한 문자를 다른 문자로 만들 때 기존의 어떤 획을 1개 지워야 하기 때문이다.



획이 7개라고 하면 7비트가 된다. 7비트에서 0은 획이 없고 1은 획이 있는 것이다. 총 128개의 조합이 나오지만 왜곡 가능한 관계를 제외시켜야 하기 때문에 3 또는 4획만 사용한다고 정하면 35개 문자 조합만 가능하다. 이런 2진수 조합 개념은 중국에서 이미 태극 8괘 형태로 나타났던 것이다.

위의 그림 중에서 쓸모 있는 것 10개만 뽑으면 왜곡 불가능한 숫자가 만들어진다. 이 때 점이나 획의 길이 차이만 나는 경우는 같은 것으로 보고 제거한다. 획을 연장시키기만 하면 왜곡이 가능하기 때문이다. 상하가 대칭이라 위아래 위치 차이만 나는 같은 모양도 제거한다.



3. 연속으로 쓸 수 있게


가능하면 1획에 글자를 쓸 수 있으면 좋다. 이건 길을 겹치지 않고 모두 도는 문제와 같다. 그럴 경우 저절로 곡선 문자가 되는데 외우고 판독하기 힘들어진다. 아랍문자, 몽고문자, 일본문자 등이 그러하다. 영어의 소문자가 이런 식으로 필기체에서 나온다. 직선 획을 쓰면 외우고 판독하기는 좋은데 한 글자를 여러 획으로 써야 한다. 중국문자, 한글이 그러하다. 영어의 대문자도 그러한데 알파벳의 원래 형태다. 라틴어는 원래 대문자만 사용했다. B, D는 2획인데 b, d는 1획에 쓴다.

이상의 것을 이용해서 고리의 개수와 위치, 직선의 개수와 위치를 정한 후에 기계적으로 획수 조합을 하고 쓰기 편한 형태만 골라낸다. 수 천 년 걸린 문자 발명을 몇 시간 안에 해 낼 수 있다. 그것도 왜곡 불가능하게 말이다.





아직도 3S(스크린, 스포츠, 섹스), 게임, 전투, 전쟁 좋아한다면 10대의 유치한 정신 상태다. 나도 아직 못 벗어났다. 정치, 경제, 종교, 역사에 관심이 있다면 늙은 정신 상태다. 종교와 정치 현상은 거의 비슷하다. 옛날엔 제정일치 사회였다고 하는데 정말 닮았다. 정치, 종교 문제의 뒤에는 경제 문제가 있다. 항상 돈이 문제다. 이 반복적 얘기들을 닮고 있는 게 역사다. 이공계에서 수학, 물리, 화학과 같은 위치에 있다.

TV, 신문에서 사람들 관심을 끄는 3S 뉴스가 나오면 정치 쪽을 함께 보라고 한다. 예로부터 정치 권력자 개인의 문제가 여러 사람 다치게 하는 전쟁으로까지 가는 일이 많았다. 권력자 개인 문제 → 사회 문제 or 전쟁. 그래서 정치 쪽을 함께 보라고 하는 것이다.

정치 쪽 내용이 그렇게 어려운 것이 아니다. 주로 보수 우익 정당 정치인의 도둑질(뇌물, 청탁, 리베이트, 비리, 커미션), 여자(매춘, 성추행, 성폭행, 불륜) 문제가 나온다. 이거 덮기 위해 엉뚱한 사건으로 관심 돌리기를 하는 것이다. 보수 우익 정당이 무능력하고 (무능하지는 않다. 안 하는 것이다.) 하는 일이 없어도 이미지 관리는 잘 해야 선거에서 이기기 때문이다.

민주(의회) vs 독재(왕정)
분배(공유) vs 독점(사유)
과학(진화) vs 종교(창조)

바른 정치란 다른 것 없다. 좌측의 것만 선택하면 된다. 공산주의자들도 좌측을 선택했는데 문제는 독재다. 김일성과 박정희는 같은 독재자로 알고 있는데, 독재를 먼저 시작한 것은 남한 이승만, 북한 김일성 때부터이다. 박정희 때는 노골적인 독재였고, 북한도 박정희의 권유로 공식적 독재로 넘어간다. 함께 각자 남북을 해 먹자는 거지.

투표를 하라고 했을 때 가지 않으면 반대표를 던진 것이고, 투표하러 가서 반대표를 던지다 걸리면 역시 반동분자이니, 남북 노인들은 좀비처럼 투표하러 가는 것이다. 그래서 아직도 남한은 북한처럼 친일 독재 잔당의 1당 독재이다. 재미있는 것은 일본도 마찬가지라는 것이다. 정권이 안 바뀐다. 2차 대전 때의 군부 독재 잔당의 1당 독재이다.

2015년 5월 18일 월요일

컴퓨터 프로그램 할 때 사용하지 말아야 할 문자

글꼴 때문에 헛갈리는 문자들이 있다. 이런 문자들은 오타가 아닌 오타를 만들기 때문에 프로그램 할 때는 사용하지 않는 것이 좋다.

  • 영문 대문자 I(아이), 영문 소문자 l(엘)은 숫자 1과 헛갈린다.
  • 영문 대문자 O(오우), 영문 소문자 o는 숫자 0과 헛갈린다.
  • 흔히 정수를 표현할 때 사용하는 영문 소문자 i와 j는 헛갈린다.


간단하게 임시로 사용하고 버리는 한 문자 길이의 정수 변수 이름에는 다음과 같은 것을 사용하는 것이 좋다. 흔히 수학 공식이나 반복문에서 첨자로 사용하는 것들이다.

영문자 (i, j, k), (l, m, n), (o, p, q) 대신 (a, b, c) 또는 (x, y, z)

글꼴에 따라 I, l, 1과 O, o, 0을 명확하게 구분해 주는 것도 있다. 글꼴은 San-Serif와 Serif로 나뉘는데 인쇄할 때는 Serif (명조체와 비슷한 꼴)를 쓰고, 모니터 화면에선 San-Serif (Serif가 없는 직선 꼴)을 사용한다. 해상도 차이로 보기 편하기 때문인데 문제는 San-Serif 형태에선 I, l, 1과 O, o, 0의 구분이 어려운 글꼴이 많다.



언론에서 자유와 평등 중에 하나를 선택하라는 식으로 선동을 많이 한다. 이들이 말하는 자유는 민주주의, 평등은 공산주의를 상징한다. 그런데 이런 저런 혁명에서 누가 자유 대신 평등, 평등 대신 자유를 외쳤겠는가? 당신 같으면 엉덩이 대신 가슴 큰 여자, 가슴 대신 엉덩이 큰 여자를 원하겠는가? 정상적인 인간이라면 엉덩이와 가슴 큰 여자를 원할 것이다. 

자유와 평등은 함께 가는 전차의 양쪽 바퀴와 같다. 대체로 자유로운 사회가 더 평등하고, 평등한 사회가 더 자유롭다. 자유와 평등이란 왕족, 귀족이 있던 신분제 사회에서의 탈출을 말하는 것이기 때문에 이 둘은 같은 것이다. 지금은 왕정 대신 독재가 있고, 귀족 대신 부자가 있으니 현대의 자유와 평등이란 민주주의와 복지주의를 말한다.

이 시대는 돈 없으면 자유가 없어! 돈이 바로 신분이고 권력이야! 그러니 자유와 평등을 얻고 싶으면 공정한, 공평한 사회를 만들란 말이지. 세계적 대부자 치고 사기, 도둑질, 투기, 매점매석 없이 부자 된 자가 없다. 절대 친일독재잔당에 투표하지 말고, 친일선동언론의 말을 믿지 말라.

2015년 1월 22일 목요일

다음팟 인코더 사용법

다음팟 인코더는 공짜이며, 인코딩만 하지 않고 편집도 가능해서 좋다. 단지 사용법 설명이 좀 부족하다. 이런 분야 프로그램 사용법은 대동소이하다. 가장 골치 아픈 것이 코덱을 선택하는 것이다. 




인코딩 화면은 동영상 파일을 재생 기기와 여러 제약 조건에 맞게 다시 인코딩할 때 사용한다. 그러니까 파일 형식 변환이라고 보면 된다. 여기선 기기와 제약 조건만 선택하면 알아서 코덱과 기타 필요한 설정을 해 준다. 기계의 화면 사이즈 한계가 있고, CPU의 처리 속도, 시스템의 용량 제한, 인터넷의 전송 속도 제한, 시스템에 따라 지원하는 코덱이 다르기 때문에 거기에 맞게 화면 크기와 코덱을 조절해야 한다. 이걸 미리 해 놓았다고 프리셋이라고 부른다. 프리셋을 선택하고 인코딩만 하면 된다.




동영상 편집 화면은 재료 동영상들에서 필요한 부분을 잘라 삽입하여 조립하는 방식과 원본 동영상에서 필요 없는 부분을 잘라 제거하는 방식으로 편집이 가능하다. 하나의 원본을 분할하거나 필요 없는 부분을 잘라 내기 할 때는 코덱을 바꿀 이유가 없기 때문에 Direct Stream Copy로 설정하면 처리 시간이 아주 빠르다. 이건 데이터를 그대로 복사하는 것이다. 그런데 형식이 다른 동영상을 묶어 하나로 만들 때는 화면 크기와 코덱을 하나로 통일 시켜야 하기 때문에 인코딩 설정을 해 주어야 한다. 기타 자막도 넣고(이미지로 박아 넣는다), 로고도 넣고, 오프닝, 엔딩 문구도 넣을 수 있다. 이런 것은 시행착오로 해 보면 되니까.




코덱을 선택하고 옵션을 조절하는 화면이다. 여기선 각 옵션을 다 이해하기 어렵다. 그래서 몇 가지 상식만 설명한다. 


포장형식 = 파일 형식 = 파일 확장자


영상, 소리, 자막(Text) 3가지를 포장하는 형식을 말한다. 코덱은 영상, 소리를 압축하는 방식이기 때문에 포장 형식 안에서 다양하게 선택할 수가 있다. 예를 들어 확장자가 AVI인 포장 형식에서도 비디오 코덱은 MPEG4, DivX, Xvid 등으로 선택할 수가 있다. 오디오 코덱은 비디오 코덱과 별개이다. 


코덱 = 압축 방식


이런저런 놈들이 여러 코덱을 만들어서 어지럽다. 품질과 압축률의 절묘한 조화를 얻기 위해서 많은 사람의 노력이 있었다. 각 코덱에서 상세 옵션을 또 선택할 수가 있다. 이건 코덱에 대한 상세한 지식이 있어야 조절 가능하기 때문에 건드리기 좀 그렇다. 코덱을 바꾸지 않고 원본의 내용을 그대로 잘라 복사하려면 무조건 Direct Stream Copy로 설정한다.


화면의 가로, 세로 크기와 종횡비


기계에 따라 화면의 가로, 세로 크기가 다르고, 또한 화면 종횡비가 다르다. 이 때문에 좌우상하가 잘리기도 하고 억지로 늘려서 퍼져 보이거나 길어 보이기도 한다. 이것을 맞추는 방법이 다양하다. 보통 화면 종횡비는 유지하고 상하, 좌우 중에 어느 하나를 맞춘다. 화면 종횡비는 다음과 같은 것이 많이 쓰인다.
  • 4:3 옛날 TV와 모니터
  • 16:9 일본 Wide TV, HDTV
  • 16:10 = 8:5 황금비 모니터
  • 14:10 = 7:5 복사용지 비율


화면 설정(가로 세로 지정)


이 부분 메뉴가 참 이해하기 어렵다. 이걸 이해하는 방법은 2가지 길이 있다.

  1. 프로그램이 작업하는 순서를 아는 것.
  2. 최종 결과물의 조합을 아는 것.


프로그램이 작업하는 순서는 이렇다.

  1. 원본 화면을 잘라내기에서 지정한 비율로 자른다.
  2. 원본 화면 비율을 유지할 경우 가로/세로 중 한 쪽 기준으로 결과 화면에 맞춘다.
  3. 원본 화면 비율을 무시할 경우 가로/세로 모두 결과 화면에 맞춘다. (디폴트)

나머지 옵션 선택은 무의미하다. 차이를 모르겠다.



최종 결과물의 조합은 위와 같은 경우 외엔 없다. 이걸 왜 깔끔하게 정리하지 못 하지? 최종 화면 크기를 지정하면 디폴트가 거기에 맞게 확대/축소이기 때문에 확대/축소 옵션 선택이 무의미하다. 잘라내기 옵션만 의미가 있는데 잘라낸 후에 어떻게 확대/축소할 것인지는 원본 화면 비율 유지/무시 옵션에 따른다. 보통 잘라내기를 할 경우는 당연히 최종 화면 비율과 자르기 비율을 일치시킨다. (물론 다르게 한 후에 확대/축소할 수도 있다.)



유명한 코덱의 종류(압축률 vs 화질)


대체로 많이 쓰는 코덱이 MPEG4인데 이건 H264와 같은 것이고 AVC라고 이름 붙어도 같은 것이다. 같은 기술에 이름만 다른 것이다. DivX는 유료 코덱이고 이것에 대항한 오픈 소스 무료 코덱이 Xvid이다. 철자 순서도 반대다. 유료 코덱은 안 되는 시스템이 있다는 의미다. 오디오 코덱은 MPEG3, AAC가 유명하겠다. 코덱의 성능을 비교할 정도의 지식이 없으니까 알아서 선택한다.


비트전송률 = 전송속도 → 화질/음질


1초에 몇 비트를 전송하는지에 대한 내용이다. 이건 유선, 무선 전송로의 성능과 CPU등의 성능과 관계 있다. 이건 고정(CBR)과 가변(VBR)이 있다. 장단점이 있다.

CBR : 내용이 많든 적든 1초에 최대 전송 양을 제한 한다. 대신 최종 용량을 예측할 수 있다. CD/DVD에 담아야 한다면 용량 예측이 필요하다. 이건 기존 동영상의 설정 값을 참고하거나 실험을 좀 해 봐야 한다. 화면이 넓고, 화질이 좋으며, 프레임률이 높으면 전송률도 높아야 한다.

VBR : 내용에 따라 많이 보내고 적게 보내기 때문에 효율적이다. 대신 최종 용량을 예측하기 어렵다. 화질 기준으로 정해야 하는데 80%는 되어야 원본과 비슷한 수준을 유지한다. 이 옵션으로 하면 원본과 비슷한 화질에 비슷한 용량으로 인코딩 된다.

※ 최대 전송량 계산
주요 화면에서 색상 깊이 24bit(JPEG YRB 8bit), 25Hz(PAL)에서 압축하지 않을 때

화면
가로
세로
Hz
kbps
모니터(4:3)
640
480
24
25
18만4320
HDTV(16:9)
1280
720
24
25
55만2960
HDTV(16:9)
1920
1080
24
25
124만4160

여기에 JPEG 압축률을 곱하거나 원본 영상으로 계산한 압축률을 곱한다.
무손실 압축률 : 약 50%(음악), 그림의 경우는 더 압축률이 높다.
유손실 압축률 : 약 10%(JPEG), 동영상의 경우는 더 압축률이 높다.
※ 받침이 없거나 ㄴ 받침이 있는 명사의 뒤에는 ~율, 그 외는 ~률



프레임률(Frame Rate) → 부드러운 동작


1초에 몇 장의 그림을 보여줄 것인지에 대한 내용이다. 이건 전통적으로 다음과 같은 경우가 많다. 애니메이션이나 영화는 이보다 작은 프레임률이다.
  • 25 f/s 유럽 PAL TV
  • 30 f/s 미국 NTSC TV
  • 60 f/s HDTV


리사이즈(확대/축소) 필터


큰 것을 작게 축소할 때는 뭘 사용하든 문제없다. 작은 것을 크게 확대할 때는 없는 정보를 만들어 넣는 보간법이 필요하다. 이 때 가장 기초적인 bilinear(XY2차원 선형 보간법)이 있는데 하면 안 좋다. 보통 bicubic(XY2차원 3차 다항식)이 적당하다. 아마 Lanczos도 뭔지 잘 모르겠으나 bicubic과 비슷한 수준의 결과를 만들어 낼 것이다.






샘플링 주파수 → 고주파 음질


사람(어린 아이들)은 보통 20~2000Hz를 듣기 때문에 이것의 약 2배인 40000Hz 이상에서 샘플링을 해야 원본 음질을 유지한다. 그래서 보통 44100으로 많이 선택 되어 있을 것이다. 늙은이들은 고음을 못 듣기 때문에 이보다 낮게 설정해도 무난하다. 인간의 육체는 20대부터 낡기 시작한다.


채널 = 스피커의 숫자


오디오의 경우는 모노(1채널), 스테레오(2채널), 기타 여러 채널이 있다. 보통 휴대용 장비나 PC에서 볼 때는 스테레오가 무난하다. 영화 원본의 사운드를 듣고 싶다면 채널 수를 확인해 보기 바란다. 그게 연결할 스피커의 숫자다. 5.1채널까지 있다.


비트 전송률


얼마로 하는 것이 적당한지는 역시 원본을 참고할 수는 있겠으나 원본과 비슷하게 설정하면 이상하게 음질이 떨어진다. 직접 계산을 해 보자.


  • 샘플링은 음악의 경우 4만Hz이상을 한다. 뉴스라면 그 절반으로 해도 된다.
  • 화면 크기에 해당하는 것이 스피커 수다. 보통 음악은 2채널, 뉴스라면 1채널.
  • VBR로 하려면 80%는 되어야 원본과 비슷한 수준이다.


※ 최대 전송량 계산
샘플링 주파수 44100Hz, 샘플링 깊이 16비트(CD), 스테레오(2채널)
압축이 없을 때 44100Hz x 16 x 2채널 = 1411kbps
여기에 MP3의 압축률을 곱하거나 원본의 압축률을 계산해서 곱한다.
원본과 같은 수준 소리 전송률 : 256kbps ~ 320kps
원본과 같은 수준 소리 압축률 : 18% ~ 23% (손실 압축)








키 프레임(Key Frame)


키 프레임이란 온전한 영상이 있는 프레임이다. 키 프레임 사이의 프레임들은 차이점만 저장되어 있다. 다시 인코딩 할 때는 키 프레임 단위로 이동할 필요가 없는데 Direct Stream Copy를 사용할 때는 키 프레임 단위로 잘라야 깔끔하다. 중간에서 자르면 화면이 깨진다. 여기서 주의할 점은 자른 지점에서 보이는 화면은 키 프레임의 화면이란 것이다. 키 프레임은 그 구간의 앞에 있다. 고로 보이는 그 화면에서 잘리지 않는다. 키 프레임으로 이동하고 싶을 때는 마우스로 근처 위치로 간 후에 재생 화면을 선택하여 좌측 방향키(←)로 이동하면 된다. 이상하게 우측 방향키(→)는 먹히지 않는다.


배속 인코딩


너무 느려 처지는 동작이 나오는 화면을 약간 빠르게 (1.1배속 ~ 1.2배속) 하면 경쾌한 느낌을 준다. 이 경우 인코딩 배속을 바꾸면 되는데 Direct Stream Copy에선 안 통하고 인코딩을 다시 해야 한다. 




기타 내가 자주 사용하는 프로그램이다.

  • 반디캠 : 동영상 캡쳐, 국세충 일베충이 세월호 영상 조작에 사용했던 프로그램.
  • 알캡처 : 화면 캡처

국세충 일베충도 세금 받아 처먹고 친일독재잔당의 범죄 덮어주기 힘들 거다. 그러니까 일을 좀 대충, 허접하게 하시라. 자꾸 말썽이 생기도록 실수를 하란 말이지. 거기서 일하는 애들도 젊은 애들 아닌가? 나라 기강을 바로 세우는데 일조를 하란 말이지.

2015년 1월 11일 일요일

TV 모니터 화면 종횡비 정리


화면 종류
종횡비
정수비
화소수
설명
가로
세로
가로
세로
DVD video 1.777~ 16 9 1280 720 Wide
DVD video 1.777~ 16 9 1920 1080 Wide
NTSC video 1.500~ 3 2 720 480 NTSC
PAL video 1.250~ 5 4 720 576 PAL
HDTV 방송 1.1852 32 27 1280 1080  
HDTV 방송 1.333~ 4 3 1024 768 TV
HDTV 방송 1.333~ 4 3 1440 1080 TV
HDTV 방송 1.777~ 16 9 1248 702 Wide
HDTV 방송 1.777~ 16 9 1280 720 Wide
HDTV 방송 1.777~ 16 9 1888 1062 Wide
HDTV 방송 1.777~ 16 9 1920 1080 Wide
HDTV 방송 1.777~ 16 9 3840 2160 Wide
HDTV 방송 1.7786 683 384 1366 768 Wide
Monitor 1.0839 168 155 1680 1550  
Monitor 1.250~ 5 4 720 576 PAL
Monitor 1.250~ 5 4 1280 1024 PAL
Monitor 1.333~ 4 3 640 480 TV
Monitor 1.333~ 4 3 800 600 TV
Monitor 1.333~ 4 3 1024 768 TV
Monitor 1.333~ 4 3 1152 864 TV
Monitor 1.333~ 4 3 1280 960 TV
Monitor 1.500~ 3 2 720 480 NTSC
Monitor 1.5625 25 16 1600 1024 NTSC
Monitor 1.600~ 8 5 1280 800 황금비
Monitor 1.600~ 8 5 1440 900 황금비
Monitor 1.600~ 8 5 1680 1050 황금비
Monitor 1.6667 5 3 1280 768 황금비
Monitor 1.7708 85 48 1360 768 Wide
Monitor 1.777~ 16 9 1280 720 Wide
Monitor 1.777~ 16 9 1600 900 Wide
Monitor 1.7786 683 384 1366 768 Wide


가장 흔한 종횡비는 아래와 같다.
  • 4:3 옛날 TV, 옛날 모니터
  • 16:9 일본의 Wide TV
  • 16:10(8:5) 황금비
  • 14:10(7:5) 복사지

자기 모니터의 종횡비 계산이 어려우니까 표로 정리한다. 최소공배수를 구한 후에 가로, 세로를 다시 나눠 주면 종횡비의 정수 비율이 나온다. 같은 종횡비의 내용을 재생하면 늘어나거나 줄어드는 일이 없다.



어릴 적에 전두환, 노태우 시절에 부모들은 대학생 자식 보고 데모에 나가지 말라고 했다. 빨갱이 물이 들어서 그렇다고 했다. 허나 진실은 잡혀서 고문 당해 죽는 꼴을 봤으니까 말리는 것이었다. 다행히 80년대 중반 민주화 되면서 더 이상 데모를 할 필요가 없어졌다. 대부분의 대학생들은 빨갱이가 아니었기 때문이다.

그래서 80년대 중반부터 대학생 데모가 거의 사라졌다. 90년대부터 공산주의도 무너졌기 때문에 더 이상 데모는 빨갱이와 관계없어졌다. 그런데 아직도 친일 선동 언론은 빨갱이 선동을 하고 있다. 진실은 좌우 대립이 아니라 선(충신)과 악(간신)의 대립이었다. 정상과 비정상의 대결이었는데 좌우 대립을 핑계로 탄압했던 것이다.

90년대부터 공산주의가 없기 때문에 좌파 사상이 담긴 서적도 자유롭게 읽을 수 있게 되었다. 민주주의 국가에선 사상과 종교의 자유가 있으니까 이제 힘이 없는 좌파 사상도 읽을 수 있게 된 것이다. 그리고 드디어 사람들은 알게 되었다. 왜 빨갱이 물이 들면 개독교인들처럼 신앙이 생기는지. 이론이 아주 단순 명확해서 아이들도 이해할 수 있을 정도의 명명백백한 것이니까. 어릴 적에 듣던 흥부 놀부 이야기의 재탕이다.

좌파 이론이 유치하다면 개독교도 자본주의도 유치한 것이다. 자본주의 때문에 좌파 사상이 생긴 것이니까. 좌파 사상의 씨앗이 개독교에 담겨 있으니까. 좌우 대립이란 결국 인류 문명 이후의 수 천 년 동안의 선악 대결이었다. 강자와 약자의 대결이었고, 부자와 거지의 대결이었고, 지배자와 노예의 대결이었다.