BOJ 2290 - LCD Test

image.png

재미있는 구현 문제이다.

정답 문자열의 총 넓이는 $\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;  
}

Tags:

Categories:

Updated:

Comments