숫자로 구성된 문자열을 주어진 칸수에 맞게 출력하면 되는 문제이다.
논리라고 할 것도 없이 구현문제이다...라고 생각했지만 그래도 나름의 이론은 필요했다. 그 전에 숫자별로 하나씩 다 그리는 무뇌 노가다를 해봤는데 좋지 않았다
숫자의 모양을 디지털계기판에 나타낼 때 주로 7세그먼트 방식을 사용하는데, 시계 방향대로 위에서부터 a,b,c,d,e,f와 정가운데 g로 이루어졌다. 이걸 이용하면 8개의 조건문으로 그림을 그릴 수 있다.
import sys
input = sys.stdin.readline
def getInts(): return map(int, input().split())
h, v = '-', '|'
s, n = input().split()
s = int(s)
def construct_segment(n):
lcd = [[' ']*(s+2) for _ in range(2*s + 3)]
for i in range(1, s+1):
if n in '02356789':
lcd[0][i] = h # a
if n in '01234789':
lcd[i][-1] = v # b
if n in '013456789':
lcd[s+1+i][-1] = v # c
if n in '0235689':
lcd[2*s + 2][i] = h # d
if n in '0268':
lcd[s+1+i][0] = v # e
if n in '045689':
lcd[i][0] = v # f
if n in '2345689':
lcd[s+1][i] = h # g
return lcd
display = [construct_segment(i) for i in n]
for line in zip(*display):
for r in line:
print(''.join(r), end=' ')
print()
그림으로 표현하면 아래와 같다.
출력을 왼쪽에서 오른쪽으로 연속적으로 하기 위해서는 lcd배열을 전처리할 방법이 필요하다.
위의 코드의 일부분인데, display 배열을 unpacking해서 zip함수 안에 len(n)개의 배열 인자를 제공했다.
display = [construct_segment(i) for i in n]
for line in zip(*display):
for r in line:
print(''.join(r), end=' ')
print()
_*pythonic하다고 평가되는 연산자들 중 하나이다.
+Asterisk는 크게 4가지 경우에 사용된다._
- 곱셈 및 거듭제곱 연산
- 리스트형 컨테이너 타입의 데이터를 반복 확장하고자 할 때
- 가변인자를 사용하고자 할 때
- 컨테이너 타입의 데이터를 Unpacking 할 때
lcd배열들이 담긴 display배열을 행이 같은 것끼리 함께 모아 하나의 원소로 통합하기 위해 사용되었다.
그림으로 표현하자면 zip함수를 써서 아래와 같이 나타냄으로써 직관적으로 출력할 수 있는 것이다.
*zip함수는 시퀸스형 데이터 타입들(string, list, dictionary, range)을 인수로 하여 각 데이터 타입들의 인덱스가 같은 원소끼리 묶어 새로운 object를 생성하는 내장 함수이다.
display = [construct_segment(i) for i in n]
zip(*display)
https://omjinlts.github.io/algorithm/2290/
https://mingrammer.com/understanding-the-asterisk-of-python/