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

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

쿼드 트리

면접 대비

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

요약
쿼드 트리 문자열을 n x n 흑백 그림으로 복호화한 뒤 각 행을 XBM 16진수 바이트로 출력한다.
난이도

보통10점 중 5점

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

문제

고대 아즈텍 문명 유적지에서 보물을 찾던 한신이는 긴 문장이 적힌 파피루스 두루마리를 발견했다. 그 문장은 BB, WW, QQ 세 종류의 문자로만 이루어져 있었다.

암호학을 조금 배웠던 한신이는 이 문자열이 3000년 전에 만들어진 유명한 쿼드 트리(quad tree) 암호 구조라는 것을 알아냈다.

쿼드 트리 암호화는 그림(예를 들어 보물지도)을 다음 규칙으로 인코딩한다.

  • 그림 전체가 검은색이면 BB로 변환한다.
  • 그림 전체가 흰색이면 WW로 변환한다.
  • 검은 부분과 흰 부분이 섞여 있으면 QxxxxQxxxx 형식으로, 그림을 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래 순서의 네 부분으로 재귀적으로 쪼갠 뒤 각 부분(xx)을 다시 변환한다.

모든 그림은 n×nn \times n 픽셀의 정사각형이며, nn은 2의 거듭제곱이고, 항상 완벽한 쿼드 트리 구조로 인코딩되어 있다.

예를 들어 2×22 \times 2 체스판은 QWBBWQWBBW로, 4×44 \times 4 체스판은 QQWBBWQWBBWQWBBWQWBBWQQWBBWQWBBWQWBBWQWBBW로 나타낼 수 있다.

이 쿼드 트리 문자열을 XBM 형식 파일로 해독하는 프로그램을 작성하라.

입력

첫째 줄에 정수 nn (8≤n≤5128 \le n \le 512)이 주어진다. 이 값은 그림의 가로·세로 픽셀 크기이며, 항상 2의 거듭제곱이다.

둘째 줄에 BB, WW, QQ로만 이루어진 문자열이 주어진다. 이 문자열은 n×nn \times n 픽셀 그림을 쿼드 트리 구조로 인코딩한 것이다.

출력

다음 형식으로 XBM 파일 내용을 출력한다.

  • 첫째 줄: #define quadtree_width n (nn은 가로 픽셀 크기이다.)
  • 둘째 줄: #define quadtree_height n (nn은 세로 픽셀 크기이다.)
  • 셋째 줄: static char quadtree_bits[] = {
  • 이어지는 nn개의 줄: 그림의 각 행을 n/8n/8개의 16진수 값으로 변환하여 출력한다. 각 16진수 값은 8개의 픽셀을 왼쪽에서 오른쪽 순서로 담은 8비트 값이며, 가장 왼쪽 픽셀의 비트 값이 1이고 가장 오른쪽 픽셀의 비트 값이 128이다. 검은 픽셀은 1, 흰 픽셀은 0으로 둔다. 각 값은 0xdd 형식(두 자리 소문자 16진수)으로 쓰고, 각 값 뒤에 쉼표(,)를 붙인다. 예를 들어 8픽셀 WBBBBWWBWBBBBWWB는 2+4+8+16+128=1582 + 4 + 8 + 16 + 128 = 158 = 0x9e이다.
  • 마지막 줄: };

예제3

  1. 예제 1

    입력
    16
    QQWBBWQWBBWQWBBWQWBBW
    
    예상 출력
    #define quadtree_width 16
    #define quadtree_height 16
    static char quadtree_bits[] = {
    0xf0,0xf0,
    0xf0,0xf0,
    0xf0,0xf0,
    0xf0,0xf0,
    0x0f,0x0f,
    0x0f,0x0f,
    0x0f,0x0f,
    0x0f,0x0f,
    0xf0,0xf0,
    0xf0,0xf0,
    0xf0,0xf0,
    0xf0,0xf0,
    0x0f,0x0f,
    0x0f,0x0f,
    0x0f,0x0f,
    0x0f,0x0f,
    };
    
  2. 예제 2

    입력
    8
    B
    
    예상 출력
    #define quadtree_width 8
    #define quadtree_height 8
    static char quadtree_bits[] = {
    0xff,
    0xff,
    0xff,
    0xff,
    0xff,
    0xff,
    0xff,
    0xff,
    };
    
  3. 예제 3

    입력
    8
    W
    
    예상 출력
    #define quadtree_width 8
    #define quadtree_height 8
    static char quadtree_bits[] = {
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    };