크기 s와 숫자 n이 주어졌을 때, 숫자를 아래처럼 LCD판에 출력하는 문제다.
-- -- -- -- -- -- -- --
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
-- -- -- -- -- -- --
| | | | | | | | | | | | |
| | | | | | | | | | | | |
-- -- -- -- -- -- --
숫자 하나의 크기는 가로 s+2, 세로 2s+3이다.
우선 숫자들이 LCD판에 출력될 때 어떻게 나오는지 숫자들마다 공통점을 찾아서 함수로 구현하려고 했다.

숫자 하나를 위 이미지 처럼 나누어서 보았고, vertical과 horizontal을 또다시 아래처럼 나눌 수 있었다.
그리고 이것을 아래와 같이 구현했다.
function r() {
// right = 공백 s+1칸 + '|'
return '|'.padStart(s + 2);
}
function l() {
// left = '|' + 공백 s+1칸
return '|'.padEnd(s + 2);
}
function b() {
// both = '|' + 공백 s칸 + '|'
return '|' + ' '.repeat(s) + '|';
}
function h() {
// horizontal = 공백 + '-' s칸 + 공백
return ' ' + '-'.repeat(s) + ' ';
}
function sh() {
// space-horizontal = 공백 s+2칸
return ' '.repeat(s + 2);
}
// 0 h, b, sh, b, h
// 1 sh, r, sh, r, sh
// 2 h, r, h, l, h
// 3 h, r, h, r, h
// 4 sh, b, h, r, sh
// 5 h, l, h, r, h
// 6 h, l, h, b, h
// 7 h, r, sh, r, sh
// 8 h, b, h, b, h
// 9 h, b, h, r, h
const topHorizontal = [h, sh, h, h, sh, h, h, h, h, h];
const midHorizontal = [sh, sh, h, h, h, h, h, sh, h, h];
const bottomHorizontal = [h, sh, h, h, sh, h, h, sh, h, h];
const topVertical = [b, r, r, r, b, l, l, r, b, b];
const bottomVertical = [b, r, l, r, r, r, b, r, b, r];
배열에 함수를 저장한 뒤, 숫자 i에 접근할 때 i번째 원소에 저장된 함수를 사용하면 된다.
그리고 반복문을 순회하며 정답을 저장해주면 된다.
const top = 0;
const bottom = 2 * s + 3 - 1;
const mid = (2 * s + 3) >> 1;
for (let i = top; i <= bottom; i++) {
for (let j = 0; j < n.length; j++) {
const num = +n[j];
if (i === top) answer += topHorizontal[num]();
else if (i === mid) answer += midHorizontal[num]();
else if (i === bottom) answer += bottomHorizontal[num]();
else if (i < mid) answer += topVertical[num]();
else if (i > mid) answer += bottomVertical[num]();
if (j === n.length - 1) answer += '\n';
else answer += ' ';
}
}
i는 0부터 숫자의 세로 길이까지 증가하도록 했고, j는 0부터 n의 길이만큼 증가하도록 했다.
j가 마지막 숫자라면 줄바꿈을 수행하고, 아니라면 공백을 추가해서 숫자 사이에 공백이 들어가도록 한다.
또한 top, bottom, mid 인덱스를 지정해서 i에 따라서 조건부로 정답에 저장되는 문자열이 달라지도록 했다.
