PC/UVa ID : 110104/706, 인기도 : A, 성공률 : 보통, 레벨 : 1

{

한 친구가 방금 새 컴퓨터를 샀다. 그 친구가 지금까지 샀던 가장 강력한 컴퓨터는 공학용 전자 계산기였다. 그런데 그 친구는 새 컴퓨터의 모니터보다 공학용 계산기에 있는 LCD 디스플레이가 더 좋다며 크게 실망하고 말았다.

그 친구를 만족시킬 수 있도록 숫자를 LCD 디스플레이 방식으로 출력하는 프로그램을 만들어 보자.

입력

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

출력

입력 파일에서 지정한 숫자를 수평 방향은 '-' 기호를, 수직 방향은 '|'를 이용해서 LCD 디스플레이 형태로 출력한다. 각 숫자는 정확하게 s + 2 개의 열, 2s + 3개의 행으로 구성된다.

마지막 숫자를 포함한 모든 숫자를 이루는 공백을 스페이스로 채워야 한다. 두개의 숫자 사이에는 정확하게 한 열의 공백이 있어야 한다.

각 숫자 다음에는 빈 줄을 한 줄로 출력한다. 밑은 각 숫자를 출력하는 방식이 나와 있다.

문제 4 풀이 스샷


소스 코드

다른 사람이 푼 것을 보니, 난 참 어렵게 구현했다는 생각 뿐.. ^^

관련 링크 :

http://www.filewiki.net/tc/entry/LCD-Display
http://www.kuku.pe.kr/entry/UVA-706-LCD-Display
http://snippets.dzone.com/posts/show/5244
1차 리팩토링 }

저작자 표시
신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요

  1. Favicon of http://ikpil.com 농사를 짓는 게임 프로그래머 최익필 2009.11.08 21:28 신고  Addr  Edit/Del  Reply

    음.. 주석 다는 습관을 완전히 갖어야 겠다는 생각이 든다. 다른 사람이 짠 소스를 이해하고, 1차 리팩토링을 거쳤었다. 이 코드를 지금 다시 보니, 머리속에 잘 들어 오지 않는다.

    주석은 나를 위해 단다는 말이 맞다.

  2. 지나가던공돌이 2014.07.08 03:41 신고  Addr  Edit/Del  Reply

    안녕하세요
    알고리즘 문제 연습하려다가 님이 올리신 문제를 검색하여 풀어봤습니다.
    비트연산이 속도에 좋다고 해서 이용해서 풀어봤는데 제 풀이 평가좀 부탁드려요.
    함수 사용이 귀찮아서 for문을 여러번 썼습니다..

    #include<stdio.h>

    int main(void)
    {
    unsigned char index[10] = { 0x5F, 0x05, 0x76, 0x75, 0x2D, 0x79, 0xFB, 0x45, 0x7F, 0x6D };
    /*
    앞 세자리는 가로줄 유무, 뒤 네자리는 세로줄 유무
    0 : 0 101 1111 = 0x9F
    1 : 0 000 0101 = 0x05
    2 : 0 111 0110 = 0x76
    3 : 0 111 0101 = 0x75
    4 : 0 010 1101 = 0x2D
    5 : 0 111 1001 = 0x79
    6 : 0 111 1011 = 0xFB
    7 : 0 100 0101 = 0x45
    8 : 0 111 1111 = 0x7F
    9 : 0 110 1101 = 0x6D
    */

    int div = 10;
    int max = 0;
    unsigned char af[8] = { 0, };
    unsigned char bf[8] = { 0, };
    int i, j, k;

    int input = 379230;
    int s = 4;

    int temp = input;


    for (i = 0; i < 8; i++)
    {

    af[i] = temp % 10;
    //af[i] = (unsigned char)k;
    max = (af[i] != 0) ? i : max;

    bf[i] = index[af[i]];

    temp /= 10;

    printf(" %d , %d\n", max, af[i]);
    }
    //printf("%d\n", max);
    for (i = max; i >= 0; i--)
    {
    printf(" ");
    for (j = 0; j < s; j++)
    {
    if (bf[i] & 0x40)
    {
    printf("-");
    }
    else
    printf(" ");
    }
    printf(" ");
    }
    printf("\n"); // 여기까지 가로 첫줄

    //printf("\n%d\n", max);

    for (i = 0; i < s; i++)
    {
    for (j = max; j >= 0; j--)
    {
    if ((bf[j] & 0X08))
    printf("|");
    else
    printf(" ");

    for (k = 0; k < s; k++)
    printf(" ");

    if (bf[j] & 0x04)
    printf("|");
    else
    printf(" ");

    printf(" ");
    }
    printf("\n"); // 여기까지 세로 첫줄
    }

    for (i = max; i >= 0; i--)
    {
    printf(" ");
    for (j = 0; j < s; j++)
    {
    if (bf[i] & 0x20)
    {
    printf("-");
    }
    else
    printf(" ");
    }
    printf(" ");
    }
    printf("\n"); // 여기까지 가로 둘째줄

    for (i = 0; i < s; i++)
    {
    for (j = max; j >= 0; j--)
    {
    if ((bf[j] & 0X02))
    printf("|");
    else
    printf(" ");

    for (k = 0; k < s; k++)
    printf(" ");

    if (bf[j] & 0x01)
    printf("|");
    else
    printf(" ");

    printf(" ");
    }
    printf("\n"); // 여기까지 세로 둘째줄
    }
    for (i = max; i >= 0; i--)
    {
    printf(" ");
    for (j = 0; j < s; j++)
    {
    if (bf[i] & 0x10)
    {
    printf("-");
    }
    else
    printf(" ");
    }
    printf(" ");
    }
    printf("\n"); // 여기까지 가로 셋째줄

    }