문제
허프만 코딩(Huffman coding)은 텍스트 압축 방법으로,
원본 데이터에서 자주 출현하는 문자는 작은 비트의 코드로 변환하고
출현 빈도가 낮은 문자는 큰 비트의 코드로 변환하여
전체 데이터를 최소한의 비트 수로 압축하는 방식이다.
이 과정에서 각 문자를 표현하기 위한 허프만 트리(Huffman tree)를 구성해야 한다.
예를 들어 AAAAAAABBCCCDEEEEFFFFFFG를 압축하려 할 때,
각 문자의 개수는 다음과 같다:
A:7개, F:6개, E:4개, C:3개, B:2개. D:1개, G:1개
이 상황에서 우선 가장 작은 D와 G를 묶어 둘의 합인 2가 부모가 되도록 트리를 구성한다.

이 후 가장 작은 두 노드인 B와 2를 묶어 합인 4이 부모가 되도록 트리를 구성한다.

이와 같은 작업을 반복하여 아래와 같은 트리를 구성한다.

최종적으로 전체 트리에 있어서 왼쪽 자식은 0, 오른쪽 자식은 1의 비트를 부여하면 허프만 트리가 완성된다.

이러한 과정을 통하여 문자열을 압축하면 아래와 같은 코드가 나온다.
AAAAAAABBCCCDEEEEFFFFFFG
0000000000000001000100011011011010101111111110101010101001011
각 문자에 대한 비트코드를 출력하는 프로그램을 작성하시오.
입력
첫 줄에 문자열의 길이 N이 주어진다. ( 1 <= N <= 100,000)
다음 줄에 알파벳 대문자로만 이루어진 문자열이 하나 입력된다.
출력
출력 예와 같이 출력하시오.
순서는 상관 없으며, 허프만 코드 조건에 만족하며 압축된 코드 길이가 정답과 같으면 답으로 처리한다.
부분문제
| 번호 | 점수 | 조건 |
|---|---|---|
| #1 | 20점 | |
| #2 | 20점 | |
| #3 | 30점 | |
| #4 | 30점 | |
예제
24
AAAAAAABBCCCDEEEEFFFFFFG
A 00
F 10
E 11
C 011
B 0100
D 01010
G 01011