본문 바로가기
프로그램/C언어 1000제

C언어 201제] LCD 디스플레이(LCD Display)

by 건티 2024. 12. 20.
728x90

출처 : 반크_백제역사 유적지구 및 이스탐블역사 유적지구

 

문제]

한 친구가 방금 새 컴퓨터를 샀다. 그 친구가 지금까지 샀던 가장 강력한 컴퓨터는 공학용 전자 계산기였다. 그런데 그 친구는 새 컴퓨터의 모니터보다 공학용 계산기에 있는 LCD 디스플레이가 더 좋다며 크게 실망하고 말았다. 그 친구를 만족시킬 수 있도록 숫자를 LCD 디스플레이 방식으로 출력하는 프로그램을 만들어보자.

입력
입력 파일은 여러 줄로 구성되며 표시될 각각의 숫자마다 한 줄씩 입력된다. 각 줄에는 s와 n이라는 두 개의 정수가 들어있으며 n은 출력될 숫자(0<=n<=99,999,999), s는 숫자를 표시하는 크기(1<=s<=10)를 의미한다. 0이 두 개 입력된 줄이 있으면 입력이 종료되며 그 줄은 처리되지 않는다.

출력
입력 파일에서 지정한 숫자를 수평 방향은 '-' 기호를, 수직 방향은 '|'를 이용해서 LCD 디스플레이 형태로 출력한다. 각 숫자는 정확하게 s+2개의 열, 2s+3개의 행으로 구성된다. 마지막 숫자를 포함한 모든 숫자를 이루는 공백을 스페이스로 채워야 한다. 두 개의 숫자 사이에는 정확하게 한 열의 공백이 있어야 한다. 각 숫자 다음에는 빈 줄을 한 줄 출력한다. 밑에 있는 출력 예에 각 숫자를 출력하는 방식이 나와있다.

입력 예
2 12345
3 67890
0 0

출력 예
   --   --         --
|     |    |  |  |  |
|     |    |  |  |  |
   --   --   --    --
| |        |     |     | 
| |        |     |     |
   --   --         --
 ---   ---    ---    ---    ---
|          |  |    |  |    |  |    |
|          |  |    |  |    |  |    |
|          |  |    |  |    |  |    |
 ---          ---    ---    
|    |     |  |    |       |  |    |
|    |     |  |    |       |  |    |
|    |     |  |    |       |  |    |
 ---          ---    ---    ---


출처]

Programming Challenges 알고리즘 트레이닝 북(한빛미디어) : 문제4 LCD 디스플레이(LCD Display) p43

 

참고풀이]

#include <stdio.h>
#include <string.h>

int main()
{
   int s, i, j, digit, num_digits;
   char number[9];
   char hor_bar[2][11]={"          ", "----------"};
   char ver_bar[2][2]={" ", "|"};
   char hor[10][3]={{1, 0, 1}, {0, 0, 0}, {1, 1, 1}, {1, 1, 1}, {0, 1, 0},
                             {1, 1, 1}, {1, 1, 1}, {1, 0, 0}, {1, 1, 1}, {1, 1, 1}};
   char ver[10][4]={{1, 1, 1, 1}, {0, 1, 0, 1}, {0, 1, 1, 0}, {0, 1, 0, 1}, 
                             {1, 1, 0, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}, {0, 1, 0, 1}, 
                             {1, 1, 1, 1}, {1, 1, 0, 1}};
   char result[5][104];

   while(1)
   {
      scanf("%d%*c",&s);
      if(s==0) break;
      if(s>=1 && s<=10)
      {
         for(i=0; i<5; i++)
            result[i][0]='\0';

         //가로 bar의 길이를 s로 맞춰놓기 위하여 '\0'를 중간에 삽입한다. 
         hor_bar[0][s]='\0';
         hor_bar[1][s]='\0';
         scanf("%s%*c",number);

         num_digits=strlen(number);
         for(i=0; i<num_digits; i++)
         {
            digit=number[i]-'0';
            //숫자 사이에는 일괄적으로 한 열 띄우기 
            if(i>0)
               for(j=0; j<5; j++) strcat(result[j], " ");
            //0번 - 맨 윗줄 가로 bar
            strcat(result[0], " ");
            strcat(result[0], hor_bar[hor[digit][0]]);
            strcat(result[0], " ");

            //1번 - 위쪽 세로 bar들
            strcat(result[1], ver_bar[ver[digit][0]]);
            strcat(result[1], hor_bar[0]);
            strcat(result[1], ver_bar[ver[digit][1]]);

            //2번 - 맨 윗줄 가로 bar
            strcat(result[2], " ");
            strcat(result[2], hor_bar[hor[digit][1]]);
            strcat(result[2], " ");

            //3번 - 위쪽 세로 bar들
            strcat(result[3], ver_bar[ver[digit][2]]);
            strcat(result[3], hor_bar[0]);
            strcat(result[3], ver_bar[ver[digit][3]]);

            //4번 - 맨 윗줄 가로 bar
            strcat(result[4], " ");
            strcat(result[4], hor_bar[hor[digit][2]]);
            strcat(result[4], " ");
         }

         puts(result[0]);
         for(i=0; i<s; i++) puts(result[1]);
         puts(result[2]);

         for(i=0; i<s; i++) puts(result[3]);
         puts(result[4]);
         putchar('\n');

         //앞에서 삽입한 '\0'을 이제 되돌려 놓는다. 
         hor_bar[0][s]=' ';
         hor_bar[1][s]='-';
      }
   }
   return 0;
}

 

참고풀이 결과]

 

 

 

 

 

대한민국의 아름다운 영토, 독도의 겨울

 

반응형

댓글