728x90
https://www.acmicpc.net/problem/2447
문제
재귀적인 패턴으로 별을 찍어 보자. 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번째 줄까지 별을 출력한다.
728x90
예제 입력 1
27
예제 출력 1
내 생각
재귀 함수 문젠데 재귀로 못풀었다.
우선, 3 x 3 패턴은 리스트에 저장해둔다.
* | * | * |
* | * | |
* | * | * |
다음으로 3 x 3 패턴을 8개 덧붙여 9 x 9 패턴으로 만든다.
* | * | * | * | * | * | * | * | * |
* | * | * | * | * | * | |||
* | * | * | * | * | * | * | * | * |
* | * | * | * | * | * | * | * | * |
* | * | * | * | * | * | |||
* | * | * | * | * | * | * | * | * |
* | * | * | * | * | * | * | * | * |
* | * | * | * | * | * | |||
* | * | * | * | * | * | * | * | * |
5번째 3 x 3 패턴에는 공백이 와야 한다.
* | * | * | * | * | * | * | * | * |
* | * | * | * | * | * | |||
* | * | * | * | * | * | * | * | * |
* | * | * | * | * | * | |||
* | * | * | * | |||||
* | * | * | * | * | * | |||
* | * | * | * | * | * | * | * | * |
* | * | * | * | * | * | |||
* | * | * | * | * | * | * | * | * |
다음으로 27 x 27, ... 모두 이와 같이 패턴을 더 해주는 형식으로 하였다.
N = int(input())
ans = [[]]
for i in range(3):
ans.append([])
# 3x3 패턴 만들기
for j in range(3):
if (i == 1) and (j ==1):
ans[i].append(' ')
else:
ans[i].append('*')
if (N != 3):
n = 9
while(n <= N):
# n x (n/3) 패턴 만들기
for i in range(int(n/3)):
for j in range(int(n/3), n):
ans[i].append(ans[i % int(n/3)][j % int(n/3)])
# n x (n/3) 패턴을 2번 이어 붙이기
for i in range(int(n/3), n):
ans.append([])
for j in range(n):
ans[i].append(ans[i % int(n/3)][j % int(n/3)])
# 패턴의 중앙을 공백 처리하기
for i in range(int(n/3), int(n/3)*2):
for j in range(int(n/3), int(n/3)*2):
ans[i][j] = ' '
n *= 3
for i in range(N):
for j in range(N):
print(ans[i][j], end='')
print()
처음에는 아래와 같이 풀었는데, 시간 초과가 걸렸다.
n x n 짜리 배열을 만들어 모두 '*'로 채운 뒤,
n 패턴에서 공백 처리해야할 부분 확인 -> n/3 패턴에서 공백처리 해야 할 부분 확인 -> ... -> 3 패턴에서 공백처리 해야 할 부분 처리
이런 방식으로 푸니까 n=3^k 일 때, n x n 배열을 k번 씩 돌며 확인을 해서 시간이 많이 걸린 것 같다.
(답이 나오긴 함.)
N = int(input())
ans = [[]]
# 모두 '*'로 채워진 27x27 배열을 만든다.
for i in range(0, N):
ans.append([])
for j in range(0, N):
ans[i].append('*')
n = N
while (n >= 3):
for i in range(0, N):
if (((i % n) // (int(N/3))) == 1):
for j in range(0, N):
if (((j % n) // (int(N/3))) == 1):
ans[i][j] = ' '
n = int(N/3)
for i in range(0, N):
for j in range(0, N):
print(ans[i][j], end='')
print()
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 2231] 분해합 (python) (0) | 2021.05.11 |
---|---|
[백준, BOJ 11729] 하노이 탑 이동 순서 (python) (0) | 2021.05.11 |
[백준, BOJ 1002] 터렛 (python) (0) | 2021.05.11 |
[백준, BOJ 3053] 택시 기하학 (python) (0) | 2021.05.11 |
[백준, BOJ 4153] 직각삼각형 (python) (0) | 2021.05.11 |