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;
}