한글 자음 모음 조합 개수 - hangeul ja-eum mo-eum johab gaesu

이 주제는 친구와 카톡으로 대화하다가 어쩌다가 튀어나오게 된 주제입니다.

어느날, 친구가 저에게 카톡으로 팬그램(모든 글자를 전부 다 써서 문장 만들기)에 관한 자료를 보내주었습니다. 영어로 예를 들자면 a부터 z까지 알파벳을 전부 사용해(꼭 한번씩만 사용할 필요는 없습니다) 문장을 만드는 겁니다. 일례로 the quick brown fox jumps over the lazy dog 라는 문장이 있습니다. 이 때, 이걸 한글로도 만들 수 있을까라는 얘기가 나왔습니다. 한글은 글자의 기준을 어떻게 잡느냐에 따라 가능할지 불가능할지 대답이 바뀌게 되죠. 자음의 경우엔 그냥 기본 자음 ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎ 만을 사용할 것이냐, 아니면 된소리인 ㄲㄸㅃㅆㅉ 도 포함시킬 것인가, 겹받침으로 쓰이는 ㄶㅄㅀ 등도 하나로 취급할 것인가 아니면 기본자음의 조합으로 취급할 것인가, 다양하게 기준을 제시할 수 있을 것이고, 모음도 ㅏㅑㅓㅕㅗㅛㅜㅠㅡㅣ 만을 쓸 것인지 아니면 이들을 합친 ㅐㅔㅘㅝㅢ 등도 독립된 하나로 취급할 것인지를 정해야 합니다.

아니면, 이 글의 주제이기도 하지만, 조합 가능한 글자 하나 하나를 따로 취급할 수도 있을 겁니다. 이 기준을 사용한다면 한국어 단어에서 결코 쓸 일이 없지만 존재는 하는 '묿' 같은 글자도 사용해야 하기 때문에, 이 기준에 의한 팬그램은 불가능하다고 결론지을 수 있습니다.

여기서, 궁금증이 하나 생겼습니다. 과연 조합 가능한 한글의 글자 개수는 총 몇 개일까요?

(현대 한국어 기준)

가갸거겨고교구규그기 에서 시작해서 개걔게계과괘궈궤긔 등도 따져봐야 되고, 또 받침도 생각해서 갈걀걸결골굘굴귤글길 이나 갧걟겗곏괇괣궓궯긟 같은 글자들도 다 세야 합니다. 잠깐 생각만 해도 개수가 어마어마하게 많을 것 같고, 도저히 수작업으로는 불가능해보이는 막막한 작업입니다.

이럴 땐 수학을 이용해서 대략적인 값을 추측해보는 방법이 있습니다. 물론 요즘같은 인터넷 시대에 검색만 하면 원하는 결과를 뚝딱 얻어낼 수 있지만, 그러면 재미 없잖아요 ㅎㅎ 한번 수학을 이용해 최대한 합리적으로 추측해봅시다.

글자의 조합을 다루는 것이기 때문에, 하나의 글자를 '초성/중성/종성'으로 분리해보겠습니다.

이때, 초성에는 자음만 올 수 있고, 중성에는 모으만 올 수 있고, 종성에는 다시 자음만 올 수 있다는 사실을 알 수 있습니다.

여기서 몇 가지 가정을 해보겠습니다.

첫째, 하나의 모음에 대해 초성에 올 수 있는 자음의 경우, 다른 모든 모음에 대해서도 초성에 올 수 있다고 가정하는 겁니다. (예를 들어 'ㅏ' 앞에 'ㄱ'이 와서 '가'가 가능하므로, 'ㄱ'은 'ㅏ' 외에도 다른 모든 모음 ㅑㅓㅕㅗㅛㅜㅠㅡㅣ 등의 초성으로 오는 게 가능하다고 취급하는 겁니다.)

둘째, 하나의 초성/중성 묶음에 대해 종성으로 올 수 있는 자음의 경우, 다른 모든 초성/중성 묶음에 대해서도 종성에 올 수 있다고 가정하는 겁니다. (예를 들어 '가' 뒤에 'ㄴ'이 와서 '간'이 가능하므로, 'ㄴ'은 '가' 외에도 '다, 루, 메, 쉐' 등의 모든 초성/중성 묶음의 종성(받침)으로 써서 '단, 룬, 멘, 쉔'을 만들 수 있다고 취급하는 겁니다)

셋째, 이와 반대로 들어갈 수 없는 자음의 경우, 다른 모든 경우에도 불가능하다고 가정하는 겁니다. (예를 들어 'ㄸ'이 '가'의 종성으로 들어갈 수 없으므로, 'ㄸ'는 다른 모든 초성/중성 묶음의 종성을 못 들어간다고 취급하는 겁니다)

이는 문제에서 너무 큰 디테일을 따지지 않고 보다 간단하게 계산할 수 있게 하기 위함입니다.

그럼 우선 초성부터 살펴보겠습니다.

초성은 그렇게 까다롭진 않습니다. 고려할 사항도 별로 없고, 예외 사항도 딱히 없어서 금방 셉니다. 기본으로 우리가 숙지하고 있는 '가나다라마바사아자차카타파하'의 14개의 자음에, 된소리를 하나씩 적용해서 추가시키면 '까따빠싸짜' 4개만 추가됩니다. 그 외에 초성에 오는 건 없습니다. 그래서 초성에는 총 19개의 자음이 오는 게 가능합니다.

다음은 모음인데, 모음은 살짝 까다롭습니다. 기본 ㅏㅑㅓㅕㅗㅛㅜㅠㅡㅣ 에, 얘네들끼리 서로 합쳐져서 ㅐㅔㅘㅝㅙㅞㅢ 등이 막 만들어집니다. 이거 그냥 머릿속에서 하려면 헷갈리고 짜증납니다. 이럴 땐 아주 원시적이고 간단한 알고리즘을 사용해 수작업을 하더라도 빼먹는 게 없도록 세면 됩니다.

여기서 주의할 점은, 이렇게 해서 새로 생긴 글자('ㅘ'와 'ㅐ')가 조합 가능한 리스트에 다시 오르기 때문에, ㅏ부터 ㅣ까지 쭉 조합의 가능성을 따져본 후에, 다시 'ㅏ'로 돌아와서 반복해봐야 합니다. 이렇게 하면 새로 생긴 'ㅐ'가 'ㅗ'와 합쳐져 'ㅙ'라는 글자를 만들어냅니다. 그리고 여기서 또 새로운 글자가 생겼으니 또 한 바퀴를 돌아야 하죠. 한글의 모음은 3바퀴만 돌면 더이상 새로운 글자가 만들어지는 것 없이 전부 나오게 됩니다.  

그렇게 해서 나온 모음의 조합 개수는 총 21개입니다.

그럼 가능한 초성/중성 묶음의 개수를 세어볼까요? 아주 간단한 곱셈으로 얻어낼 수 있습니다. 초성에 올 수 있는 총 19개의 자음과, 중성에 올 수 있는 총 21개의 모음을 서로 곱해주면 됩니다.

그럼 이제 남은 건 종성으로 올 수 있는 자음의 개수를 구하는 것인데... 이게 좀 까다롭습니다. 일단 초성에서 사용하였던 목록표를 다시 가져와보면

받침이 없는 경우도 포함해야 하므로 (받침없음)을 기본에 추가하고, 받침으로 쓰이지 않는 ㄸ과 ㅃ과 ㅉ을 제외하면, 일단 기본적인 종성의 개수는 17개입니다. 하지만 이게 다가 아닙니다.

종성에는 '겹받침'이라는 게 있습니다. ㄶ, ㄺ, ㄼ, ㄶ 같은 것들을 가리키는 표현인데, 이걸 일일이 찾아서 세기는... 귀찮습니다.

여기서 저는 이런 방법을 생각해봤습니다. 우선, 기본적인 종성의 개수는 17개이지 않습니까? 그렇다면 n의 최솟값은 17인 셈입니다. 따라서 한글의 조합수의 최솟값은

한글 자음 모음 조합 개수 - hangeul ja-eum mo-eum johab gaesu

6783개가 됩니다. 하지만 분명히 겹받침이 존재하니까 한글의 가능한 조합수는 무조건!! 6783개보다는 많습니다.

한글 자음 모음 조합 개수 - hangeul ja-eum mo-eum johab gaesu

그렇다면 한번 이렇게 생각해봅시다. 겹받침을 일일이 생각해서 셀 필요없이, 일단 최대한 가능한 겹받침의 조합을 전부 생각해봐서 N의 최대값을 생각해보는 겁니다. 하지만 그렇다고 무식하게 모든 자음들을 전부 서로 합쳐버리지는 않을 겁니다. 그러면 너무나도 터무니없이 많은 겹받침의 후보들이 튀어나와서 오차가 커집니다. 따라서 세세하게 세는 행위는 하지 않더라도, 기본적으로 불가능한 것들은 얼추 걸러낼 필요가 있습니다.

기본적으로 생각했을 때, 겹받침에서 처음에 올 수 있는 자음은 (받침없음), ㄱ, ㄴ, ㄹ, 이 4개입니다. (예를 들어 ㄳ, ㄶ, ㄼ 이 있으며, (받침없음)은 겹받침이 아닌 받침(ㄱ, ㄴ, ㄷ, ㄹ 등)을 만듭니다) 여기서 (받침없음)과 자기자신과 된소리를 제외하면 13개의 자음이 남습니다. 따라서

한글 자음 모음 조합 개수 - hangeul ja-eum mo-eum johab gaesu

하지만 이 최댓값의 경우에는 ㄱ과 ㅎ이 합쳐져있거나 ㄴ과 ㅌ이 합쳐져있는 말도 안 되는 겹받침도 전부 포함한 숫자입니다. 따라서 실제 한글의 가능한 조합 개수는 절대로 21147개가 될 수 없습니다. 반드시 이 개수보다는 적어야 합니다.

한글 자음 모음 조합 개수 - hangeul ja-eum mo-eum johab gaesu

6800개에서 21000개 사이로 추정된다니, 너무 범위가 크다고 어이없어 하실 분이 계실 것 같네요. 이런 추측이라면 누가 못 하겠습니까? 무려 가능한 '개수'의 후보가 14200개 정도에 육박합니다!

그럼 대략적으로라도 추정해봅시다. 이 때, 실제값에서 최대한 멀어지지 않도록(오차가 최대한 커지지 않도록) 추정값을 정하는 게 중요합니다. 어떻게 하면 오차가 커지는 리스크를 최대한 줄일 수 있을까요?

여기서 오차의 리스크를 가장 적게 줄이는 방법은 <중간값을 선택하는 것>입니다. 전체 길이를 100이라고 봤을 때, 추정값으로 중간값을 선택하면 실제값이 추정값의 왼쪽의 임의의 지점에 있든 오른쪽의 임의의 지점에 있든, 오차의 최댓값은 50을 넘을 수가 없습니다.

하지만 만약 추정값이 중간값에서 벗어나 왼쪽이나 오른쪽으로 기울어진다면, 아주 운 좋게 실제값이 추정값이 기울어진 방향에 존재해서 오차가 작을 수도 있지만, 반대로 기울어진 방향 반대쪽에 존재해서 오차가 매우 커질 위험성이 있습니다.

쉽게 말해, 더 높은 수익을 얻을 수 있는 가능성도 있지만 실패한다면 손해도 더 크게 입을 위험이 있는 사업에 투자를 하느냐, 아니면 높은 수익은 얻을 수는 없지만 손해가 그리 크지 않은, 적어도 중간은 가는 안정적인 상품에 투자를 하느냐의 문제와 비슷합니다.

만약 우리가 사업에 대한 정보를 더 많이 얻는다면, 그 사업이 실패를 할지 안 할지를 더 정확히 알게 되어서 안정적인 상품에 의존하지 않아도 될 수 있지만, 그러한 정보가 없다면 안정적인 상품에 투자하는 게 낫습니다.

 이걸 현재 풀고 있는 수학 문제에 대응시키자면, 우리는 가능한 한글의 조합 개수가 6783개와 21147개 중에 어느쪽에 더 가까운 값을 가지는지 알아낼 수 있는 정보가 딱히 주어져있지 않습니다. 그냥 적당히 최솟값과 최댓값을 구해서 범위를 정해놨을 뿐입니다. 이런 상황에서라면 중간값을 선택하는 게 현명할 수 있습니다.

3과 6의 중간값은 5입니다. 이는 (3+6)+1 을 2로 나눈 값입니다. 중간값은 이런 식으로 구합니다.

한글 자음 모음 조합 개수 - hangeul ja-eum mo-eum johab gaesu

실제로 개수는 소수가 나올 수 없으므로, 대략 13964개에서 13965개 언저리에 존재할 것이라고 추정해볼 수 있습니다.

여기서 이 막대의 길이를 이 범위 내의 정수의 개수로 정의하면, 이 막대의 길이는 14365가 되고, 이를 100%라고 취급을 하면 1%의 값은 143.65가 됩니다. 말하자면 저 막대를 100등분했을 때, 한 조각의 길이가 143.65라고 생각하시면 됩니다.

그럼 한번 실제로 가능한 한글의 조합 개수가 몇 개인지 찾아볼까요?

인터넷에서 찾아본 결과, 현대 한글에서 가능한 조합의 개수는

11172개

2793.5 만큼의 오차가 납니다. 1%의 길이가 143.65라고 계산하였으니, 2793.5를 143.65로 나누면 약 19.45%가 나옵니다.

중간값인 13965.5를 중심으로 전체 범위에서 40%에 이르는 범위 안에 실제값이 들어가 있습니다. 전체 범위의 절반을 넘어버리는 불상사는 일어나지 않았지만, 그렇다고 해서 그렇게 작은 값도 아닙니다. 과연 이걸 13965.5의 <언저리>라고 부를 수 있을지는...허허 ;;

결과를 보니 아무래도 겹받침의 개수를 너무 크게 잡았다는 걸 알 수 있습니다. 어느정도 예견된 일이긴 했죠. 처음에 올 수 있는 4가지만 골라내어서, 나머지 가능한 조합을 다 섞어놨으니 그 개수가 실제 개수에 비해 굉장히 많아졌을 겁니다. 그 결과 중간값이 실제값의 오른쪽으로 많이 기울어졌고, 결국 오차가 생각보다 크게 나게 되었습니다.

12000개 정도만 나왔어도 좋았을텐데, 좀 많이 아쉬운 결과네요 ㅎㅎ 그래도 즐거운 작업이었습니다. 끝까지 읽어주셔서 감사합니다. 좋은 하루 되시길 바랍니다.

<여담>

겹받침에서 처음에 올 수 있는 자음들을 골라내지 않았을 때, 한글 조합 개수의 최댓값은 무려 84189개로 치솟습니다. 이 범위를 적용한다면

실제값(11172)과 중간값(45486.5) 사이의 거리가 어마무시해집니다. 정말 이건 백번 양보해도 중간값의 언저리라고 결코 부를 수 없는 왼쪽 구석탱이(?)에 실제값이 처박히게 됩니다. 대신 이 범위에서 보면, 저희의 추정치(13965.5)는 실제값(11172)에서 4% 정도밖에 안 떨어져있는 거리에 존재합니다.

즉, 겹받침에서 처음에 올 수 있는 받침의 개수를 4개로 추려낸 것만으로 추정치의 정확도는 굉장히 높아진 셈입니다. 같은 범위 내에서 정확도가 거의 10배 더 높아졌습니다 ㅎㅎ