문자 묶음의 개수가 같으면, 같은 짝으로 묶인 걸까?

국기 표기에 쓰이는 문자를 두 개씩 묶는 규칙을 봅니다. 문자열을 나누어 따로 처리한 뒤 잇는다면, 묶음 개수만으로 원래 짝이 보존됐는지 알 수 있을까요?

검은 화면 노트북과 별도 키보드 앞에 서로 떨어져 놓인 무지 종이 조각 세 개

이미지: AI 생성 · 수학 이야기

길게 이어진 문자를 나누어 처리했더니, 전체 문자 묶음 수는 같게 나왔다. 그렇다면 같은 두 문자끼리 묶였다는 뜻일까?

Unicode 기본 확장 문자 묶음 규칙 중, Regional Indicator(RI) 코드 포인트만 이어진 경우를 본다. RI는 국기 표기에 쓰이는 문자 종류다. 이 순서열은 각 텍스트의 시작부터 두 개씩 묶고, 길이가 홀수이면 마지막 하나를 홀로 둔다. 모든 RI 쌍이 실제 국기로 표시된다는 뜻은 아니며 화면 모양·폰트·국가 코드의 유효성은 다루지 않는다.

RI 코드 포인트 n개(n≥1)를 원래 순서대로 고정한다. k는1≤k≤n인 정수다. 온전한 코드 포인트 사이에서 잘라, 비어 있지 않은 연속 조각 k개를 만든다. 조각별 길이는 양의 정수 d₁,…,dₖ이고 합이n이다. 각 조각은 별도 텍스트로 보고 시작에서 두 개씩 묶는다. 그 결과 묶음 목록을 순서대로 잇되, 다시 묶거나 앞 조각의 상태를 전달하지 않는다.

원래 위치1,…,n 중 어느 위치들이 한 묶음인가를 비교한다. 같은 값의 문자라도 위치는 구별한다. 실제 문자를 삭제·추가·재배열하지 않는다. 서로 다른 자르기 위치 집합을 다른 분할로 센다.

모든n과k에서 가능한 총 묶음 수 S 및 그 수를 만드는 분할 수를 구하라. 전체를 한 번에 처리한 묶음 수와 같아지는 조건, 원래 모든 묶음 경계까지 보존되는 조건도 구하라. 숫자만 같고 짝은 달라지는 분할은 정확히 몇 개인가? n=3,k=2와 n=7,k=3에서 확인하라. 특정 소프트웨어의 오류나 처리 성능을 조사한 문제가 아니라, 위 독립 처리 조건의 자체 문항이다.

원래 위치를 적으면 전체 처리는 (1,2),(3,4),…로 짝짓고, 홀수 길이의 마지막만 홀로 남긴다. 분할 (1,2)는 세 문자 중 첫째 하나를 먼저 처리한다는 뜻이다. 그 결과는 (1),(2,3)이다. 원래 (1,2),(3)과 둘 다 두 묶음이지만 짝은 다르다. 길이 분할 (2,1)은 원래 경계를 보존한다.

조각 중 홀수 길이인 것의 개수를 m이라 하자. 길이 d를 따로 처리하면 ⌈d/2⌉묶음이다. 이를 더하면

S=∑i=1k⌈di2⌉=n+m2,G=⌈n2⌉.S=\sum_{i=1}^{k}\left\lceil{d_i\over2}\right\rceil={n+m\over2}, \qquad G=\left\lceil{n\over2}\right\rceil.

G는 전체를 한 번에 처리한 묶음 수다. n이 짝수이면 S=G는 모든 조각 길이가 짝수인 조건이다. n이 홀수이면 정확히 한 조각 길이만 홀수여야 한다. 홀수 조각이 어디에 놓이는지까지는 숫자 검사가 알려 주지 않는다.

원래 짝을 모두 보존할 조건은 더 강하다. 안쪽 자르기 위치가 전부 짝수 위치 뒤여야 한다. 홀수 위치 뒤를 자르면 원래 그 위치와 다음 위치가 한 쌍인데, 다른 조각으로 갈라져 다시 한 묶음이 될 수 없다. 반대로 모든 경계가 짝수 위치 뒤면 원래 짝 사이에서만 잘랐으므로 각 조각에서 짝 규칙을 다시 시작해도 정확히 같은 짝이 나온다. 이는 첫 k−1개 조각의 길이가 모두 짝수인 조건과 같다. 마지막 조각은 n과 같은 홀짝이다.

모든 출력 수와 분할 수도 구할 수 있다. 각 조각이 적어도 한 묶음이고 0≤m≤k이므로 가능한 S는 다음 정수들이다.

max⁡(⌈n2⌉,k)≤S≤⌊n+k2⌋,D(n,k,S)=(k2S−n)(S−1k−1).\max\left(\left\lceil{n\over2}\right\rceil,k\right)\le S\le \left\lfloor{n+k\over2}\right\rfloor, \qquad D(n,k,S)=\binom{k}{2S-n}\binom{S-1}{k-1}.

이 범위의 모든 정수가 실제 가능하다. m=2S−n개의 홀수 조각 위치를 고른다. 그 위치에는 길이1, 나머지에는 길이2를 먼저 준다. 길이의 최소 합2k−m에서 n까지는 2(S−k)가 남는다. 조각마다2씩 더하는 횟수 uᵢ를 음이 아닌 정수로 정하면 합은 S−k다. k개의 나머지 횟수를 나누는 수는 중복조합 C(S−1,k−1)이고, 홀수 위치 선택 C(k,m)을 곱한다. 선택과 최종 길이 목록은 일대일이다. 범위 밖 S의 분할 수는0이다.

이제 숫자 검사와 경계 검사를 나란히 세자. C(A,B)는 A개에서 B개를 고르는 조합의 수이며, B>A이면0으로 정한다.

전체 길이 전체와 묶음 수가 같은 분할 원래 경계까지 같은 분할 숫자만 같은 분할
n=2N, N≥1 C(N−1,k−1) C(N−1,k−1) 0
n=2N+1, N≥0 k C(N,k−1) C(N,k−1) (k−1) C(N,k−1)

짝수 길이는 모든 조각이 짝수여야 하므로 두 검사가 같다. 각 길이를2로 나누면 합N의 k개 양의 정수 목록이다. 1씩 먼저 빼서 비음수 해의 수 C(N−1,k−1)를 얻는다. k>N이면 그런 분할은 없다.

홀수 길이의 숫자 일치는 홀수 조각 위치 j를 k곳 중 고를 수 있다. j의 길이는2t+1(t≥0), 나머지는2vᵢ(vᵢ≥1)로 쓴다. 나머지 k−1곳에서1씩 빼면 k개 비음수 정수의 합이 N−k+1이다. 따라서 각 j에서 C(N,k−1)개다. 원래 경계를 보존하려면 홀수 조각이 마지막이어야 한다. 마지막 이외의 k−1가지 위치가 모두 숫자만 같은 경우여서 표의 마지막 값을 얻는다. k>N+1이면 세 값 모두0이다.

일곱 문자를 세 조각으로 나누는 전체 방법은 C(6,2)=15개다. 가능한 출력 수는4와5다. 네 묶음인 분할은9개, 다섯 묶음인 분할은6개다. 원래 네 묶음과 숫자가 같은9개 중, 경계를 보존하는 길이 목록은 (2,2,3),(2,4,1),(4,2,1) 세 개뿐이다. 나머지6개는 (1,2,4),(1,4,2),(3,2,2),(2,1,4),(2,3,2),(4,1,2)다. 홀수 조각이 마지막이 아닌 모든 경우다.

k=1이면 자르지 않으므로 항상 원래 경계다. n=1,k=1도 홀로 있는 한 묶음이며 C(0,0)=1이 맞는다. 빈 조각이나 n=0은 이 모형에 없다. 원문 문자 조각을 먼저 모두 이어 붙인 뒤 한 번에 다시 묶는 처리라면 원래 경계가 나오는 것이 당연하지만, 지금 문제는 이미 만든 묶음 목록을 다시 나누지 않는 조건이다.

교사는 먼저 세 문자의 두 가지 분할을 실제 위치 번호로 적게 한다. 같은 숫자 옆에 같은 짝이 적혀 있는지 확인하는 것이다. 이어 홀수 조각의 개수와 위치를 별도로 표시한다. 모든n/k의 결과를 구했어도 ‘홀짝은 중요하다’거나 ‘요약은 정보를 잃는다’는 일반 교훈을 새 정리로 주장하지 않는다. 알려진 중복조합은 길이 목록을 빠짐없이 세는 도구다.

이 글의 묶음은 화면에 보이는 글자 그림과 같은 개념이 아니다. Unicode 기본 확장 문자 묶음의 RI-only 부분에 한정했으며 결합 문자·다른 문자 종류·맞춤 규칙은 넣지 않았다. 원전은 경계 판정에 앞뒤 문맥이 필요할 수 있음을 이미 설명한다. 여기서는 독립 조각 시작에서 규칙을 다시 시작한다고 명시한 모형의 모든 분할을 분류했다. 실제 프로그램이 이 방식으로 처리한다거나 국기 표시가 깨진다는 실험 결과는 아니다.

착안: Unicode Consortium, Unicode Text Segmentation, UAX #29 revision49, 2026년9월1일. 기본 확장 문자 묶음의 RI 짝 규칙만 배경으로 참고했다. 원문 문장·규칙 표·그림·로고를 옮기지 않았으며, 입력·독립 처리 조건·분할 예시와 전체 계수 증명은 자체 교육용으로 작성했다.