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 |