728x90
2680번: QR
QR 코드는 위와 같이 최소 21*21개의 단위 픽셀로 이루어진 정방형의 흑백 픽셀 매트릭스이다. 각각의 픽셀은 나타내는 내용에 따라 위치 감지 패턴(과녁 모양의 작은 정사각형), 타이밍 패턴(교
www.acmicpc.net
#include "stdio.h"
int P;
#define MAX 152
int arr[MAX];
char input[39];
char characters[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:";
char output[200];
void set_arr() {
int num = 0;
for (int i = 0; i < 38; i++) {
switch (input[i]) {
case 'A' :
num = 10; break;
case 'B':
num = 11; break;
case 'C':
num = 12; break;
case 'D':
num = 13; break;
case 'E':
num = 14; break;
case 'F':
num = 15; break;
default :
num = input[i] - '0'; break;
}
//printf("%d ", num);
for (int j = 3; j >= 0; j--) {
arr[i * 4 + j] = num & 1;
num >>= 1;
}
}
/*
for (int i = 0; i < MAX; i+=4) {
printf("%d%d%d%d ", arr[i], arr[i + 1], arr[i + 2], arr[i + 3]);
}
*/
}
int get_mode(int idx) {
if (idx + 4 >= MAX) {
return 0;
}
int mode = 0;
int radix = 1;
for (int i = idx + 3; i >= idx; i--) {
mode += radix * arr[i];
radix <<= 1;
}
return mode;
}
int decode_num(int idx, int bit_count) {
int num = 0;
int radix = 1;
for (int i = idx + bit_count - 1; i >= idx; i--) {
num += radix * arr[i];
radix <<= 1;
}
return num;
}
int main()
{
//freopen("input.txt", "r", stdin);
scanf("%d", &P);
for (int tc = 0; tc < P; tc++) {
scanf("%s", input);
set_arr();
int idx = 0;
int mode = 0;
int count = 0;
int ret = 0;
int out_index = 0;
int temp = 0;
while (idx < MAX) {
mode = get_mode(idx);
idx += 4;
if (mode == 1) {
count = decode_num(idx, 10);
idx += 10;
ret += count;
while (count >= 3) {
temp = decode_num(idx, 10);
output[out_index++] = temp / 100 + '0';
output[out_index++] = (temp % 100) / 10 + '0';
output[out_index++] = temp % 10 + '0';
count -= 3;
idx += 10;
}
if (count == 2) {
temp = decode_num(idx, 7);
//printf("%d", temp);
output[out_index++] = temp / 10 + '0';
output[out_index++] = temp % 10 + '0';
count = 0;
idx += 7;
}
else if (count == 1) {
temp = decode_num(idx, 4);
output[out_index++] = temp + '0';
count = 0;
idx += 4;
}
}
else if (mode == 2) {
count = decode_num(idx, 9);
idx += 9;
ret += count;
while (count >= 2) {
temp = decode_num(idx, 11);
output[out_index++] = characters[temp / 45];
output[out_index++] = characters[temp % 45];
count -= 2;
idx += 11;
//printf("%c%c", characters[temp / 45], characters[temp % 45]);
}
if (count == 1) {
temp = decode_num(idx, 6);
output[out_index++] = characters[temp];
idx += 6;
}
//output[out_index++] = '\0';
//printf("%s\n", output);
//break;
}
else if (mode == 4) {
count = decode_num(idx, 8);
idx += 8;
ret += count;
while (count > 0) {
temp = decode_num(idx, 8);
if (temp >= 32 && temp <= 126) {
output[out_index++] = temp;
//printf("%c", temp);
}
else {
output[out_index++] = '\\';
int hex = temp / 16;
if (hex < 10) {
output[out_index++] = hex + '0';
}
else {
output[out_index++] = hex - 10 + 'A';
}
int mod = temp % 16;
if (mod < 10) {
output[out_index++] = mod + '0';
}
else {
output[out_index++] = mod - 10 + 'A';
}
}
count--;
idx += 8;
}
}
else if (mode == 8) {
count = decode_num(idx, 8);
idx += 8;
ret += count;
while (count > 0) {
output[out_index++] = '\#';
temp = decode_num(idx, 1);
output[out_index++] = temp + '0';
idx += 1;
temp = decode_num(idx, 4);
if (temp < 10) {
output[out_index++] = temp + '0';
}
else {
output[out_index++] = temp - 10 + 'A';
}
idx += 4;
temp = decode_num(idx, 4);
if (temp < 10) {
output[out_index++] = temp + '0';
}
else {
output[out_index++] = temp - 10 + 'A';
}
idx += 4;
temp = decode_num(idx, 4);
if (temp < 10) {
output[out_index++] = temp + '0';
}
else {
output[out_index++] = temp - 10 + 'A';
}
idx += 4;
count--;
}
}
else {
break;
}
}
output[out_index++] = '\0';
printf("%d %s\n", ret, output);
}
return 0;
}
728x90
반응형
'IT 정보 > 알고리즘(백준, BOJ)' 카테고리의 다른 글
[백준-BOJ] 2806 (0) | 2021.02.18 |
---|---|
[백준-BOJ] 2696 (0) | 2021.02.15 |
[백준-BOJ] 2673 (0) | 2021.02.15 |
[백준-BOJ] 2624 (0) | 2021.02.15 |
[백준-BOJ] 2602 (0) | 2021.02.12 |