아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

엘리어스 감마 코드

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

요약
이진수 비트 길이별 개수가 주어질 때, 접두사 이동과 선택적 앞자리 0을 이용해 전체 부호 길이의 최솟값을 구한다.
난이도

보통10점 중 7점

유형
동적 계획법, 그리디
정답자
아직 제출이 없습니다

문제

엘리어스 감마 코드(Elias gamma code)는 양의 정수로 이루어진 수열을 인코딩하는 데 쓰는 코드이다. 이 문제에서는 00도 인코딩할 수 있도록 변형한 코드를 사용한다.

정수 nn을 인코딩하는 과정은 다음과 같다.

  1. nn을 이진수로 나타냈을 때의 비트 수를 kk라고 한다. (단, 00의 비트 수는 11로 본다.)
  2. 00을 k−1k-1개 쓰고, 그 뒤에 11을 하나 쓴다. (이 부분을 prefix라고 부른다.)
  3. 이어서 nn을 이진수로 쓴다.

00부터 88까지 인코딩한 결과는 아래와 같다.

숫자이진수비트 수prefix코드
001110
111111
2102010110
3112010111
41003001001100
51013001001101
61103001001110
71113001001111
810004000100011000

정수 수열을 인코딩하려면 수열의 각 수를 위 방법으로 코드로 바꾼 뒤, 수열에 나온 순서 그대로 이어 붙인다.

인코딩된 코드를 다시 원래 수로 디코딩할 때는, 이진수 표현 앞에 붙는 prefix가 핵심 역할을 한다. 인코딩된 수열을 읽을 때 11을 만나기 전에 00을 k−1k-1개 읽었다면, 그 뒤의 kk개 비트가 인코딩된 수라는 뜻이다.

인코딩 결과의 전체 길이를 줄이기 위해 다음 두 가지 최적화를 생각할 수 있다.

  1. prefix는 원래 자신이 나타내는 비트 수 kk가 정해져 있다. 그런데 수열에 비트 수가 정확히 kk인 수가 하나도 없다면, 이 prefix를 k+1k+1비트 수를 나타내는 데 사용할 수 있다. 만약 k+1k+1비트를 나타내는 prefix가 이미 쓰이고 있다면 k+2k+2비트를 나타내는 데 쓰고, 이런 식으로 계속 밀어 올린다. 이렇게 하면 그 수들의 prefix 길이가 짧아진다.
  2. 비트 수가 kk인 모든 수 앞에 00을 하나 붙이면, 그 수들은 모두 비트 수가 k+1k+1이 된다. 이렇게 만든 뒤 최적화 1을 적용할 수도 있다. 이 방법은 비트 수가 kk인 수는 매우 적고, 그보다 비트 수가 큰 수는 많은 경우에 효과적이다.

수열을 인코딩한 결과의 길이를 최소로 만들려고 한다. 수열의 구체적인 수는 주어지지 않고, 대신 비트 수가 ii인 수의 개수를 cic_i로 준다.

예를 들어 c1=2c_1=2, c2=4c_2=4, c3=0c_3=0, c4=1c_4=1인 경우를 생각하자. (수열 2,1,3,8,0,2,32, 1, 3, 8, 0, 2, 3이 이에 해당한다.) 최적화를 전혀 하지 않은 길이는 2×(1+1) + 4×(2+2) + 0×(3+3) + 1×(4+4) = 28이다. 최적화 1을 써서 prefix 001001을 44비트 수를 나타내는 데 쓰면 11비트를 줄일 수 있다. 또 최적화 2를 써서 11비트 수 앞에 00을 붙여 22비트로 만들 수 있다. 여기에 다시 최적화 1을 적용해 prefix 11은 22비트 수에, prefix 0101은 44비트 수에 쓰면, 인코딩된 문자열의 길이는 6×(1+2) + 1×(2+4) = 24가 된다.

두 최적화는 여러 번 사용할 수 있다. 두 방법을 적절히 조합해 얻을 수 있는 최소 길이를 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫째 줄에는 정수 nn이 주어진다. (1≤n≤1281 ≤ n ≤ 128) 둘째 줄에는 c1c_1부터 cnc_n까지 nn개의 값이 공백으로 구분되어 주어진다. (0≤ci≤100000 ≤ c_i ≤ 10000) 입력은 n=0n=0인 줄로 끝나며, 이 줄은 처리하지 않는다.

출력

각 테스트 케이스마다, 주어진 수열을 인코딩했을 때 가능한 최소 엘리어스 감마 인코딩 길이를 한 줄에 하나씩 출력한다.

예제3

  1. 예제 1

    입력
    4
    2 4 0 1
    5
    9 4 2 4 3
    11
    44 56 96 26 73 80 77 50 33 16 78
    0
    
    예상 출력
    24
    99
    5494
    
  2. 예제 2

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

    입력
    1
    0
    0
    
    예상 출력
    0