본문 바로가기

백준

2290)LCD Test

https://www.acmicpc.net/problem/2290


주어진 수를 전광판처럼 출력해야 한다.


전광판에 나타나는 숫자는 그림처럼 몇 개의 막대로 표현된다.


각 막대는 가로 방향 막대와 세로 방향 막대로 나눠볼 수 있다.


또 각각의 막대는 출력되는 위치가 있다.

             

세로 방향 막대는 왼쪽 그림에서 0,1,2,3의 위치를 가지며


가로 방향 막대는 오른쪽 그림에서 0,1,2의 위치를 갖는다.


자 숫자 7을 출력한다고 하자. 어떤 막대를 사용해야 할까?

0번 가로 막대와 0,3번 세로 막대를 사용하면 되겠다.


위와 같은 방식으로 각 숫자를 표현할 때 위치 별로 가로 막대 함수, 세로 막대 함수로 배열을 채우면 된다.


배열에 막대를 저장할 때 시작 위치를 결정하는 방법에 대해 생각해보자.


예를들어 "00"에서 두 번째 0을 출력한다고 하자.


첫 번째 0은 이미 배열에 들어가 있고 두 번째 0을 배열에 넣어야 한다.


첫 번째 0의 가로 길이만큼 건너뛰어야 한다.


따라서 두 번째 0을 넣을 가로 방향의 시작 위치는 (s+2+1)*n이다. (s:막대 갯수, n: 각 숫자의 인덱스)


식이 이렇게 나온건 각 숫자가 공백 라인을 하나 포함하기 때문이다.

위 그림은 s의 크기에 따라 막대가 저장되어야 할 인덱스를 나타내고 있다.


1번 가로 막대를 배열에 넣을 때 시작위치는 Xstart = 1이고 Ystart = 0이다.


Xstart를 하나씩 늘려가며 '|'를 s번 저장하면 배열에 1번 가로막대를 저장할 수 있다.


다른 가로 막대와 세로 막대도 같은 방식으로 배열에 저장하면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include<stdio.h>
 
void fillVerticalBar(char **LCD, int s, int n, int location) {
    int startX;
    int startY = (s+3)*n;
 
    switch (location) {
        case 0:
            startX = 1;
            startY += s+1;
            break;
        case 1:
            startX = 1;
            break;
        case 2:
            startX = s+2;
            break;
        case 3:
            startX = s+2;
            startY += s + 1;
            break;
    }
    for (int cnt = 0; cnt < s; cnt++) {
        LCD[startX+cnt][startY] = '|';
    }
}
 
void fillHorizontalBar(char **LCD, int s, int n,int location) {
    int startX;
    int startY = (s+3)*n+1;
 
    switch (location) {
    case 0:
        startX = 0;
        break;
    case 1:
        startX = s+1;
        break;
    case 2:
        startX = 2*(s+1);
        break;
    }
 
    for (int cnt = 0; cnt < s; cnt++) {
        LCD[startX][startY+cnt] = '-';
    }
}
 
int main() {
    int s;
    int length = 0;
    char seq[11];
    char **LCD;
    int width, height;
 
    scanf("%d %s",&s,seq);
    //가로 : s+2, 세로 : 2s+3
    width = s+3, height = 2*s+3;
    for (int i = 0; seq[i] != NULL;i++) length++;
    
    LCD = (char **)malloc(sizeof(char *)*(height));
    for (int i = 0; i < height; i++) {
        LCD[i] = (char *)malloc(sizeof(char)*(width*length+1));
    }
 
    for (int i = 0; i < height;i++) {
        for (int j = 0; j < width*length+1;j++) {
            LCD[i][j] = ' ';
        }
        LCD[i][width*length+1= NULL;
    }
 
    for (int i = 0; seq[i] != NULL;i++) {
        switch (seq[i]){
            case '0':
                fillVerticalBar(LCD, s, i, 0);
                fillVerticalBar(LCD, s, i, 1);
                fillVerticalBar(LCD, s, i, 2);
                fillVerticalBar(LCD, s, i, 3);
                fillHorizontalBar(LCD, s, i, 0);
                fillHorizontalBar(LCD, s, i, 2);
                break;
            case '1':
                fillVerticalBar(LCD, s, i, 0);
                fillVerticalBar(LCD, s, i, 3);
                break;
            case '2':
                fillVerticalBar(LCD, s, i, 0);
                fillVerticalBar(LCD, s, i, 2);
                fillHorizontalBar(LCD, s, i, 0);
                fillHorizontalBar(LCD, s, i, 1);
                fillHorizontalBar(LCD, s, i, 2);
                break;
            case '3':
                fillVerticalBar(LCD, s, i, 0);
                fillVerticalBar(LCD, s, i, 3);
                fillHorizontalBar(LCD, s, i, 0);
                fillHorizontalBar(LCD, s, i, 1);
                fillHorizontalBar(LCD, s, i, 2);
                break;
            case '4':
                fillVerticalBar(LCD, s, i, 0);
                fillVerticalBar(LCD, s, i, 1);
                fillVerticalBar(LCD, s, i, 3);
                fillHorizontalBar(LCD, s, i, 1);
                break;
            case '5':
                fillVerticalBar(LCD, s, i, 1);
                fillVerticalBar(LCD, s, i, 3);
                fillHorizontalBar(LCD, s, i, 0);
                fillHorizontalBar(LCD, s, i, 1);
                fillHorizontalBar(LCD, s, i, 2);
                break;
            case '6':
                fillVerticalBar(LCD, s, i, 1);
                fillVerticalBar(LCD, s, i, 2);
                fillVerticalBar(LCD, s, i, 3);
                fillHorizontalBar(LCD, s, i, 0);
                fillHorizontalBar(LCD, s, i, 1);
                fillHorizontalBar(LCD, s, i, 2);
                break;
            case '7':
                fillVerticalBar(LCD, s, i, 0);
                fillVerticalBar(LCD, s, i, 3);
                fillHorizontalBar(LCD, s, i, 0);
                break;
            case '8':
                fillVerticalBar(LCD, s, i, 0);
                fillVerticalBar(LCD, s, i, 1);
                fillVerticalBar(LCD, s, i, 2);
                fillVerticalBar(LCD, s, i, 3);
                fillHorizontalBar(LCD, s, i, 0);
                fillHorizontalBar(LCD, s, i, 1);
                fillHorizontalBar(LCD, s, i, 2);
                break;
            case '9':
                fillVerticalBar(LCD, s, i, 0);
                fillVerticalBar(LCD, s, i, 1);
                fillVerticalBar(LCD, s, i, 3);
                fillHorizontalBar(LCD, s, i, 0);
                fillHorizontalBar(LCD, s, i, 1);
                fillHorizontalBar(LCD, s, i, 2);
                break;
        }
    }
 
    for (int i = 0; i < height; i++) {
        printf("%s\n", LCD[i]);
    }
 
    return 0;
}
cs










'백준' 카테고리의 다른 글

2309)일곱난쟁이  (0) 2019.02.11
2217)로프  (0) 2019.02.11
9324)진짜 메세지  (0) 2019.02.09
1057)토너먼트  (0) 2019.02.08
1094)막대기  (0) 2019.02.08