문제 4. LCD 디스플레이(LCD Disply)
PC/UVa ID: 1101014/706, 인기도:A, 성공률: 보통, 레벨:1
>> 문제
한 친구가 방금 새 컴퓨터를 샀다. 그친구가 지금까지 샀던 가장 강력한 컴퓨터는 공학용 전자 계산
기였다. 그런데 그 친구는 새 컴퓨터의 모니터보다 공학용 계산기에 있는 LCD 디스플레이가 더 좋다
며 크게 실망하고 말았다. 그 친구를 만족시킬 수 있도록 숫자를 LCD 디스플레이 방식으로 출력하는
프로그램을 만들어보자.
>> 입력
입력 파일은 여러 줄로 구성되며 표시될 각각의 숫자마다 한줄씩 입력된다. 각 줄에는 s와 n이라는 두개
의 정수가 들어있으며 n은 출력될 수사(0<=n<=99,999,999), s는 숫자를 표시하는 크기(1<=s<=10)를 의미
한다. 0이 두 개 입력된 줄이 있으면 입력이 종류되며 그 줄은 처리되지 않는다.
>> 출력
입력 파일에서 지정한 숫자를 수평방향은 '-' 기호를, 수직 방향은 '|'를 이용하서 LCD 디스플레이 형태로
출력한다. 각 숫자는 정확하게 s+2개의 열, 2s+3개의 행으로 구성된다. 마지막 숫자를 포함한 모든 숫자를
이루는 공백을 스페이스로 채워야 한다. 두개의 숫자 사이에는 정확하게 한 열의 공백이 있어야 한다.
각 숫자 다음에는 빈 줄을 한줄 출력한다. 밑에 있는 출력 예에 각 숫자를 출력하는 방식이 나와있다.
>> 입출력예
소스 보기
#include <iostream>
using namespace std;
class CNumber
{
public:
CNumber(){}
~CNumber(){}
private:
int size, number, numberLen;
int x, y, oneX;
int *bitNum;
char **board;
int top, mid, bot, left, right;
public:
void SetSizeNumber(int size, int number)
{
this->numberLen = 0;
this->size = size;
this->number = number;
int temp = number;
while(temp >= 10)
{
temp/=10;
this->numberLen++;
}
this->numberLen++;
// ((s+2) * numLen) + (번호사이의 공백+한줄의 끝)
this->x = ((size+2)*this->numberLen) + (this->numberLen*3);
this->y = ((size*2)+3);
this->oneX = size+2;
this->top = 0;
this->mid = this->y/2;
this->bot = this->y-1;
this->left = 0;
this->right = (size+2);
}
void Print(void)
{
this->MakeNumber();
for(int i = 0; i < this->y; i++)
{
cout << this->board[i] << "\n";
}
this->RealseNumber();
}
private:
void MakeNumber(void)
{
// 일단 숫자를 하나씩 쪼갠다.
this->bitNum = new int[this->numberLen];
for(int i = 0, temp = this->number; i < this->numberLen; i++)
{
bitNum[this->numberLen-i-1] = temp % 10;
temp /= 10;
}
// 크기에 맞게 board를 만들어준다.
this->board = new char*[this->y];
for(int i = 0; i < this->y; i++)
this->board[i] = new char[this->x+1];
for(int y = 0; y < this->y; y++)
for( int x = 0; x< this->x; x++)
this->board[y][x] = ' ';
for(int i = 0; i< this->y; i++)
this->board[i][this->x] = NULL;
for(int i = 0; i < this->numberLen; i++)
{
this->printNumber((this->oneX*i)+(i*3), this->bitNum[i]);
}
}
void printNumber(int startX, int printN)
{
switch (printN)
{
case 0:
this->printTopCenter(startX);
this->printTopLeft(startX);
this->printTopRight(startX);
this->printBotLeft(startX);
this->printBotRight(startX);
this->printBotCenter(startX);
break;
case 1:
this->printTopRight(startX);
this->printBotRight(startX);
break;
case 2:
this->printTopCenter(startX);
this->printTopRight(startX);
this->printMidCenter(startX);
this->printBotLeft(startX);
this->printBotCenter(startX);
break;
case 3:
this->printTopCenter(startX);
this->printTopRight(startX);
this->printMidCenter(startX);
this->printBotRight(startX);
this->printBotCenter(startX);
break;
case 4:
this->printTopLeft(startX);
this->printTopRight(startX);
this->printMidCenter(startX);
this->printBotRight(startX);
break;
case 5:
this->printTopCenter(startX);
this->printTopLeft(startX);
this->printMidCenter(startX);
this->printBotRight(startX);
this->printBotCenter(startX);
break;
case 6:
this->printTopCenter(startX);
this->printTopLeft(startX);
this->printMidCenter(startX);
this->printBotLeft(startX);
this->printBotRight(startX);
this->printBotCenter(startX);
break;
case 7:
this->printTopCenter(startX);
this->printTopRight(startX);
this->printBotRight(startX);
break;
case 8:
this->printTopCenter(startX);
this->printTopLeft(startX);
this->printTopRight(startX);
this->printMidCenter(startX);
this->printBotLeft(startX);
this->printBotRight(startX);
this->printBotCenter(startX);
break;
case 9:
this->printTopCenter(startX);
this->printTopLeft(startX);
this->printTopRight(startX);
this->printMidCenter(startX);
this->printBotRight(startX);
this->printBotCenter(startX);
break;
}
}
void printTopCenter(int startX)
{
for(int i = startX+1; i < startX+this->right; i++)
this->board[this->top][i] = '-';
}
void printMidCenter(int startX)
{
for(int i = startX+1; i < startX+this->right; i++)
this->board[this->mid][i] = '-';
}
void printBotCenter(int startX)
{
for(int i = startX+1; i < startX+this->right; i++)
this->board[this->bot][i] = '-';
}
void printTopLeft(int startX)
{
for(int i = this->top+1; i < this->mid; i++)
this->board[i][startX+this->left] = '|';
}
void printBotLeft(int startX)
{
for(int i = this->mid+1; i < this->bot; i++)
this->board[i][startX+this->left] = '|';
}
void printTopRight(int startX)
{
for(int i = this->top+1; i < this->mid; i++)
this->board[i][startX+this->right] = '|';
}
void printBotRight(int startX)
{
for(int i = this->mid+1; i < this->bot; i++)
this->board[i][startX+this->right] = '|';
}
void RealseNumber(void)
{
delete []this->bitNum;
for(int i = 0; i < this->y; i++)
delete []this->board[i];
delete []this->board;
}
};
void main (void)
{
while(true){
int s, n;
cin >> s >> n;
if ( s == 0 && n == 0 )
break;
if ( s < 1 || s > 10 )
continue;
if ( n < 1 || n > 99999999)
continue;
CNumber Number;
Number.SetSizeNumber(s, n);
Number.Print();
}
}