제로베이스/코딩테스트

[백준] 2447 별 찍기 - 10 코드 분석

진주네카라 2021. 10. 25. 15:37
728x90

문제

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

입력

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

 


풀이 코드 

def star(n):
    global arr

    if n == 3:
        arr[0][:3] = arr[2][:3] = [1] * 3
        arr[1][:3] = [1, 0, 1]
        return

    a = n // 3
    star(a)
    for i in range(3):
        for j in range(3):
            if i == 1 and j == 1:
                continue
            for k in range(a):
                arr[a*i + k][a*j : a*(j+1)] = arr[k][:a]
                # i,j,k 헷갈리는 경우 print
                # print(f'ijk 입력: {i, j, k}')
                # print(f'ijk 계산: {(a*i + k), a*j, a*(j+1), k, a}')
                # print(f'ijk 결과: {arr[a*i + k][a*j : a*(j+1)]}')

n = int(input())
arr = [[0 for i in range(n)] for i in range(n)]

star(n)
for i in arr:
    for j in i:
        if j:
            print('*', end='')
        else:
            print(' ', end='')
    print()

 

필요한 공부

2차원 배열

 

배열 생성하기

array = [[0 for col in range(3)] for row in range(3)]

 

3행(row) 3열(col)

= 3X3 리스트 생성 

 

이번 문제에서 col = row 개수 같으므로 i 라고 지정

 

코드 설명

nxn 배열

  • 이 배열은 일정한 규칙을 가지고 중간에 공백을 만든다. 규칙을 알아내면
  • n = 9인 경우와 n = 3인 경우 .. 다 방법은 같다.

 

1 = '*' 별을 의미 (회색 블럭)

0 = ' ' 공백을 의미 (노란색 블럭)

 

먼저 n = 3 인경우를 이해하기.

    if n == 3:
        arr[0][:3] = arr[2][:3] = [1] * 3
        arr[1][:3] = [1, 0, 1]
        return

 

n = 9 인경우

 

 

a = n // 3
    star(a)
    for i in range(3):
        for j in range(3):
            if i == 1 and j == 1:
                continue
            for k in range(a):
                arr[a*i + k][a*j : a*(j+1)] = arr[k][:a]

a 는 보라색(3x3)으로 나눈 단위 수로 이해하면 된다.

 

 

i, j ,k 이해하기

  • 입력 (0, 0, 0) --> 계산(0, 0, 3) --> 출력 [1, 1, 1]
    • n=9일때  arr[0][0:3]의 출력값은 n=3일때 arr[0][0:3] 출력값과 같다.
  • 입력 (0, 0, 1) --> 계산(1, 0, 3) --> 출력 [1, 0, 1]
  • 입력 (0, 0, 2) --> 계산(2, 0, 3) --> 출력 [1, 1, 1]

그래서 중간 계산과정 역할은 실제 위치를 n=3인 경우에 해당하는 값으로 변환 시킨다.

print를 실행하면 더 쉽게 이해 할 수 있다.

 

for i in arr:
    for j in i:
        if j:
            print('*', end='')
        else:
            print(' ', end='')
    print()

변환을 마치고 

1과 0으로 이루어진 arrary가 완성되고 각 숫자에 해당하는 값을 넣어 출력하면 완성된다.

 

 

코드를 분석하면서 이해했다ㅠㅠ

정말 어렵다..배열과 재귀 공부 많이 해야지!


참고 글

 

https://study-all-night.tistory.com/5

https://yeol2.tistory.com/38

728x90