[알고리즘]백준, 2290번 LCD Test

Lee Yongin·2023년 9월 23일
0

알고리즘

목록 보기
6/8

문제

숫자로 구성된 문자열을 주어진 칸수에 맞게 출력하면 되는 문제이다.
논리라고 할 것도 없이 구현문제이다...라고 생각했지만 그래도 나름의 이론은 필요했다. 그 전에 숫자별로 하나씩 다 그리는 무뇌 노가다를 해봤는데 좋지 않았다

아이디어

숫자의 모양을 디지털계기판에 나타낼 때 주로 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배열을 전처리할 방법이 필요하다.

1. Asterisk 연산자

위의 코드의 일부분인데, 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 할 때

2, zip() 함수

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/

profile
f1을 좋아하는...🏆 f1처럼 빠르고 정확한 걸 좋아하는 안드로이드 개발자

0개의 댓글