본문 바로가기

code/BOJ

백준 2290 LCD Test

 

 

2290번: LCD Test

문제 지민이는 새로운 컴퓨터를 샀다. 하지만 새로운 컴퓨터에 사은품으로 온 LC-디스플레이 모니터가 잘 안나오는 것이다. 지민이의 친한 친구인 지환이는 지민이의 새로운 모니터를 위해 테스트 할 수 있는 프로그램을 만들기로 하였다. 입력 첫째 줄에 두 개의 정수 s와 n이 들어온다. (1 ≤ s ≤ 10, 0 ≤ n ≤ 9,999,999,999)이다. n은 LCD 모니터에 나타내야 할 수 이며, s는 크기이다. 출력 길이가 s인 '-'와 '|'를 이용해서

www.acmicpc.net

지난 코드로부터의 개선:

이전 코드(12546935)처럼 문자/공백 여부를 bool로 저장하면 메모리는 절약할 수 있지만 bool값을 읽어와서 매번 문자를 쓸지 공백을 쓸지 분기가 발생해서 속도가 느려지기 때문에 분기 없이 문자 또는 공백을 char로 저장해 읽어오는 즉시 출력 가능토록 한다.

/* 34분 소요 */
/* 1. 빈칸 2개는 작은 따옴표가 아니라 큰 따옴표에 묶여야 한다 : '  '가 아니라 "  " */
/* 2. 세로는 여러줄에 걸쳐 출력되기에 개행 여러번 필요 -> for문 안에 개행 출력 추가*/
/* A. 가로 세로는 alternating하는 위치가 다르기 때문에 alternating하는 위치만 저장해서 메모리 절약 */

#include <iostream>
#include <string>

using namespace std;

int s;
string n;
#define loop(x, n) for(int x = 0; x < (n); ++x)

char hori[3][10] = {	/* A */
{'-', ' ', '-', '-', ' ', '-', '-', '-', '-', '-'},
{' ', ' ', '-', '-', '-', '-', '-', ' ', '-', '-'},
{'-', ' ', '-', '-', ' ', '-', '-', ' ', '-', '-'}
};

char vert[2][10][2] = {	/* A */
{{'|', '|'}, {' ', '|'}, {' ', '|'}, {' ', '|'}, {'|', '|'}, {'|', ' '}, {'|', ' '}, {' ', '|'}, {'|', '|'}, {'|', '|'}},
{{'|', '|'}, {' ', '|'}, {'|', ' '}, {' ', '|'}, {' ', '|'}, {' ', '|'}, {'|', '|'}, {' ', '|'}, {'|', '|'}, {' ', '|'}}
};

void draw_hori(int r) {
	for (auto dgt : n) {
		cout << ' ';
		loop(si, s) cout << hori[r][dgt - '0'];
		cout << "  ";	/* 1 */
	}
	cout << '\n';
}

void draw_vert(int r) {
	loop(si1, s) {
		for (auto dgt : n) {
			cout << vert[r][dgt - '0'][0];
			loop(si2, s) cout << ' ';
			cout << vert[r][dgt - '0'][1];
			cout << ' ';
		}
		cout << '\n';	/* 2 */
	}
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	cin >> s; cin.get();
	getline(cin, n);

	draw_hori(0);
	draw_vert(0);
	draw_hori(1);
	draw_vert(1);
	draw_hori(2);

	return 0;
}