엘리아스 오메가 부호화

시간 제한1초메모리 제한128 MB

요약
0이 나올 때까지 각 양의 정수에 대해 비트 길이의 코드를 재귀적으로 앞에 붙여 엘리어스 오메가 코드를 출력한다.
난이도

쉬움10점 중 3점

유형
비트 연산, 재귀, 구현, 수학
정답자
아직 제출이 없습니다

문제

엘리아스(Elias) 부호는 부호화할 양의 정수의 크기에 대한 사전 정보가 없고, 작은 정수가 나올 확률이 큰 정수가 나올 확률보다 크거나 같다고 가정할 때 정수를 효율적으로 부호화하는 접두 부호이다. 이 문제에서는 정수의 크기에 상한을 두며, 부호화할 모든 정수는 11보다 크다.

엘리아스는 세 가지 변형인 엘리아스 감마(gamma), 델타(delta), 오메가(omega) 부호를 정의했다. 이 문제에서는 감마 부호와 오메가 부호를 소개하고, 엘리아스 오메가 부호를 구현하도록 요구한다.

양의 정수 nn의 이진 표현을 β(n)\beta(n)이라 하자(가장 앞 비트는 항상 11이다). 그리고 그 비트 수를 ∣β(n)∣|\beta(n)|이라 하자. 수신자가 ∣β(n)∣|\beta(n)|을 미리 안다면 송신자는 β(n)\beta(n)만 보내면 된다. 모른다면 먼저 그 길이를 스스로 구분 가능한(self-delimiting) 방식으로 보내야 하며, 각 변형은 이 길이를 부호화하는 방법에서 차이가 난다.

엘리아스 감마. 양의 정수 nn은 이어 붙인 두 필드로 표현된다. 앞부분(prefix)은 ⌊log⁡2n⌋\lfloor \log_2 n \rfloor개의 00 비트이고, 뒷부분은 ⌊log⁡2n⌋+1\lfloor \log_2 n \rfloor + 1개의 비트를 차지하는 β(n)\beta(n)이다. 예를 들어 β(9)=1001\beta(9) = 1001이므로 99의 감마 부호는 00010010001001이다. 앞의 00 세 개는 뒤에 네 비트가 온다는 뜻이고, 그 네 비트가 β(9)\beta(9)이다.

엘리아스 오메가. 오메가 부호는 앞부분에 00을 나열하는 대신 그 길이를 재귀적으로 부호화한다. ⌊log⁡2n⌋=∣β(n)∣−1\lfloor \log_2 n \rfloor = |\beta(n)| - 1로 두면, 오메가 부호는 다음과 같이 정의된다.

code(n)={0 β(n),⌊log⁡2n⌋=1 인 경우code ⁣(⌊log⁡2n⌋) β(n),그 외의 경우\mathrm{code}(n) = \begin{cases} 0\,\beta(n), & \lfloor \log_2 n \rfloor = 1 \text{ 인 경우} \\ \mathrm{code}\!\left(\lfloor \log_2 n \rfloor\right)\,\beta(n), & \text{그 외의 경우} \end{cases}

즉, 어떤 단계의 앞부분에 필요한 00이 하나뿐이 되는 순간 재귀가 멈춘다.

예를 들어 536870907536870907을 살펴보자. 그 이진 표현 β(536870907)\beta(536870907)은 2929비트가 필요하다. 단계별로 부호를 만들면(β(2)=10\beta(2)=10, β(4)=100\beta(4)=100, β(28)=11100\beta(28)=11100):

0    10    100    11100    β(536870907).0 \;\; 10 \;\; 100 \;\; 11100 \;\; \beta(536870907).

모두 이어 붙이면 엘리아스 오메가 부호

01010011100111111111111111111111111110110101001110011111111111111111111111111011

를 얻으며, 이는 유일하게 복호화되어 536870907536870907로 되돌아간다.

여러 개의 양의 정수가 주어질 때, 각 정수의 엘리아스 오메가 부호를 출력하여라.

입력

각 줄에는 2≤n≤2,000,000,0002 \le n \le 2{,}000{,}000{,}000을 만족하는 양의 정수 nn이 하나씩 주어진다. 00이 적힌 줄은 입력의 끝을 나타내며 부호화하지 않는다. 종료용 00 앞에 오는 정수는 최대 100100개이다.

출력

입력의 각 정수에 대해(종료용 00은 제외) 그 엘리아스 오메가 부호를 입력 순서대로 한 줄에 하나씩 출력한다. 출력에는 공백이나 빈 줄이 없어야 한다.

예제4

  1. 예제 1

    입력
    2
    510
    7
    120000
    536870905
    49
    5
    0
    
    예상 출력
    010
    0111000111111110
    010111
    0101001000011101010011000000
    0101001110011111111111111111111111111001
    010101110001
    010101
    
  2. 예제 2

    입력
    2
    0
    
    예상 출력
    010
    
  3. 예제 3

    입력
    3
    0
    
    예상 출력
    011
    
  4. 예제 4

    입력
    4
    0
    
    예상 출력
    010100