제로베이스/코딩테스트
[백준] 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가 완성되고 각 숫자에 해당하는 값을 넣어 출력하면 완성된다.
코드를 분석하면서 이해했다ㅠㅠ
정말 어렵다..배열과 재귀 공부 많이 해야지!
참고 글
728x90