(Python) 시퀀스 연산자 */+

실험하는 코더·2024년 9월 1일

python 입문

목록 보기
7/7

사실, 이 글은 2번째 포스트를 하면서 생각난 주제입니다.
논리 연산자의 글을 적으면서 여러 연산자를 적다보니 시퀀스 연산자를 간단히 언급했는데, 간단한 예시만 보여드릴까하여 글을 적어보았습니다.
아마 모두들 개발자 공부를 시작하거나, 개발자가 아니더라도 코딩 공부를 하면 백준이라는 Web site를 들어보셨을 겁니다. 그 중 '별찍기10'이라는 문제를 풀고 다른 사람들의 풀이를 확인하면서 새로운 풀이를 확인했을 때, 시퀀스 연산자를 이용하여 푸는 방법을 알게 되었습니다.
별찍기 10

먼저, 문제는
***
* *
***
의 형태를 만들어 나가는 문제입니다. 3*3 형태를 기본 구조로 갖고
9*9의 형태는 아래처럼 생겼습니다.

*********
* ** ** *
*********
***   ***
* *   * *
***   ***
*********
* ** ** *
*********

그럼, 이것들이 어떻게 시퀀스 연산자와 관계가 있을까요?
다른 때와 같이 시퀀스 연산자에 대해 다시 알아보겠습니다.

시퀀스 연산자란?

시퀀스 연산자는 말그대로 시퀀스에서 사용되는 연산자인데
대표적으로 +와 *이 있습니다.
두 연산자는 우리가 알고 있는 더하기와 곱하기랑 같은데 시퀀스에 사용할 수 있는 연산자
입니다.

예시를 통해 알아보겠습니다.

a=[1,2,3]
b=['a','b','c']
print(a+b) # [1, 2, 3, 'a', 'b', 'c']
print(a*3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]
print(a*2 +b*3) # [1, 2, 3, 1, 2, 3, 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
a=[[1],[2],[3]]
for i in range(3):
	a[i] *=3
print(a) # [[1,1,1],[2,2,2],[3,3,3]]

파이썬에서는 시퀀스 연산자를 사용한다면, 리스트를 합하거나 요소를 반복적으로 사용하는데 유용합니다.

별찍기에서 응용

별찍기10에서 이 시퀀스 연산자를 응용한다면 간편하게 구현할 수 있습니다.

  1. 우선 제일 기본인 골격을 만들어줍니다.
a=[['***'],['* *'],['***']]
  1. 다음 골격을 만들어주기 위해 가로 줄부터 완성해줍니다.
    가로줄을 완성한 다음 3번 반복하여 사각형을 만들어줍니다.
for i in range(3):
	a[i]*=3
for i in range(2):
	for j in range(3):
    	a.append(a[i][:])

이 때, 주의할 점은 세로줄을 3줄로 만드는 과저에서 a *=3으로 진행하게 된다면 얕은복사가 일어나 하나의 리스트 주소를 공유하게 되어 수정하는 가운데를 비어주는 작업을 수행할 수 없습니다.
리스트를 곱하는 방법 대신 리스트의 마지막원소로 추가하는 형식을 통해 얕은 복사를 막아줍니다.

  1. 가운데 부분을 공백으로 만들어줍니다.
for i in range(9):
	if (i //3)==1:
    	a[i][1] = ' ' * 3 
    
  1. ''.join을 이용하여 줄 단위로 묶어줍니다.
for i in range(9):
	a[i] = [''.join(a[i])]

이 과정을 반복문을 통해 원하는 길이에 맞춰 진행하면 별찍기가 가능합니다.

arr = [['***'], ['* *'], ['***']]
n = int(input())
l=3
while l<n:
    for i in range(l):
        arr[i] *= 3
    for _ in range(2):
        for i in range(l):
            arr.append(arr[i][:])

    for i in range(l*3):
        if i // l == 1:
            arr[i][1] = ' ' * l

    for i in range(l*3):
        arr[i] = [''.join(arr[i])]
    l*=3
for row in arr:
    print(*row)
profile
노베이스의 기록

0개의 댓글