이진 부호화

면접 대비

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

요약
정수 m이 주어질 때 0부터 m-1까지 각 수에 대해 절단 이진 부호를 구해 순서대로 출력하는 문제입니다.
난이도

쉬움10점 중 3점

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

문제

이진 부호화는 00부터 2n−12^n - 1까지의 각 정수를 정확히 nn개의 비트로 나타내며, 각 비트는 00 또는 11이다. 가장 큰 자리(최상위 비트)를 먼저 쓰고, 두 부호를 비교할 때는 최상위 비트부터 최하위 비트 방향으로 왼쪽에서 오른쪽으로 비교한다. 부호는 정수를 오름차순으로 나열했을 때 그 부호들도 오름차순이 되도록 배정한다. 예를 들어 00부터 77까지의 이진 부호화는 다음과 같다.

정수부호정수부호
00004100
10015101
20106110
30117111

절단 이진 부호화는 이를 일반화하여 00부터 m−1m - 1까지의 정수를 나타내는데, 이때 mm은 어떤 nn에 대해서도 2n2^n과 같지 않을 수 있다. 보통의 이진 부호화와 달리, 서로 다른 정수를 나타낼 때 서로 다른 개수의 비트를 사용할 수 있다. m≤2nm \le 2^n을 만족하는 가장 작은 정수를 nn이라 하자. 그러면 절단 이진 부호화는 각 정수를 nn개 또는 n−1n - 1개의 비트로 나타낸다. 어떤 정수가 n−1n - 1개의 비트만 사용하는 경우는 오직 m<2nm < 2^n일 때뿐이며, m=2nm = 2^n이면 절단 이진 부호화는 보통의 이진 부호화와 같아진다. 절단 이진 부호도 이진 부호와 마찬가지로 왼쪽에서 오른쪽으로 비교한다.

절단 이진 부호화는 다음 규칙도 만족한다.

  • 작은 정수는 큰 정수와 같거나 더 적은 개수의 비트를 사용한다.
  • 정수를 오름차순으로 나열하면 그 부호들도 오름차순이 된다.
  • 00부터 m−1m - 1까지의 정수에 대한 부호는 모두 서로 다르다.
  • n−1n - 1개의 비트로 된 어떤 부호도 nn개의 비트로 된 부호의 접두사가 되지 않는다.
  • 00부터 m−1m - 1까지의 정수를 나타내는 데 쓰이는 전체 비트 수가 최소이다.

예를 들어 00부터 55까지의 절단 이진 부호화는 다음과 같다.

정수부호정수부호
0004110
1015111
2100
3101

00부터 m−1m - 1까지의 정수를 절단 이진 부호화로 부호화하라.

입력

입력은 정수 mm 하나를 포함한다 (2≤m≤100002 \le m \le 10000).

출력

mm개의 줄을 출력한다. 00부터 m−1m - 1까지의 각 ii에 대해, ii번째 줄에는 정수 ii의 절단 이진 부호를 출력한다. 따라서 부호들은 그것이 나타내는 정수의 오름차순으로 출력된다.

예제1

  1. 예제 1

    입력
    6
    
    예상 출력
    00
    01
    100
    101
    110
    111