IT 정보/알고리즘(백준, BOJ)

[백준-BOJ] 2680

Dalyoung 2021. 2. 15. 22:19
728x90

www.acmicpc.net/problem/2680

 

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