본문 바로가기

C++ in Windows/Challenges

ICPC 대비 문제 4. LCD 디스플레이(LCD Disply)


문제 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();
	}
}