BOJ 2290 - LCD Test
재미있는 구현 문제이다.
정답 문자열의 총 넓이는 $\vert n \vert(s+2) + (\vert n \vert - 1)$ 이고, 총 높이는 $2s+3$ 이다.
이러한 문자열의 배열을 미리 초기화한다.
보면 총 $7$개의 획만 디스플레이에 필요한 것을 알 수 있고, 어떤 $x-\text{offset}$을 기준으로 이 획을 긋는 함수 $7$개를 먼저 만들고 $0 \sim 9$까지를 모두 획을 그어서 처리해주면 편하다.
void solve() {
int s;
string n;
cin >> s >> n;
int w = sz(n) * (s + 2) + (sz(n) - 1) * 1;
int h = 2 * s + 3;
vs ans(h, string(w, ' '));
int W = s + 2;
int H = 2 * s + 3;
auto add = [&](int xoffset, char num) {
auto h1 = [&]() { for (int x = 1; x < W - 1; x++) ans[0][xoffset + x] = '-'; };
auto h2 = [&]() { for (int x = 1; x < W - 1; x++) ans[s + 1][xoffset + x] = '-'; };
auto h3 = [&]() { for (int x = 1; x < W - 1; x++) ans[s * 2 + 2][xoffset + x] = '-'; };
auto v1 = [&]() { for (int y = 1; y < s + 1; y++) ans[y][xoffset] = '|'; };
auto v2 = [&]() { for (int y = 1; y < s + 1; y++) ans[y][xoffset + W - 1] = '|'; };
auto v3 = [&]() { for (int y = s + 2; y < 2 * s + 2; y++) ans[y][xoffset] = '|'; };
auto v4 = [&]() { for (int y = s + 2; y < 2 * s + 2; y++) ans[y][xoffset + W - 1] = '|'; };
if (num == '0') h1(), h3(), v1(), v2(), v3(), v4();
if (num == '1') v2(), v4();
if (num == '2') h1(), v2(), h2(), v3(), h3();
if (num == '3') h1(), v2(), h2(), v4(), h3();
if (num == '4') v1(), v2(), h2(), v4();
if (num == '5') h1(), v1(), h2(), v4(), h3();
if (num == '6') h1(), v1(), h2(), v3(), v4(), h3();
if (num == '7') h1(), v2(), v4();
if (num == '8') h1(), v1(), v2(), h2(), v3(), v4(), h3();
if (num == '9') h1(), v1(), v2(), h2(), v4(), h3();
};
for (int i = 0, x = 0; i < sz(n); i++, x += (1 + s + 2))add(x, n[i]);
for (int i = 0; i < h; i++) cout << ans[i] << endl;
}
Comments