[백준] 2447번 별 찍기-10

[백준] 2447번 별 찍기-10

출처: [백준] 2447번 별 찍기-10


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 37375 17060 13949 46.314%

문제

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

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

1
2
3
***
* *
***

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


입력

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


출력

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


예제 입력 1

1
27

예제 출력 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
********* *********
* ** ** * * ** ** *
********* *********
*** *** *** ***
* * * * * * * *
*** *** *** ***
********* *********
* ** ** * * ** ** *
********* *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************

힌트

  • -

출처

  • 문제를 만든 사람: baekjoon
  • 문제를 다시 작성한 사람: jh05013

알고리즘 분류


시간 제한

  • -

풀이

  • 1, 4, 7, 10, 13, 16, 19, 22, 25 …. 3으로 나눈 나머지가 1인 부분이 공백
  • 전체를 봤을때, 3줄씩 한 세트라고 하면, 3, 4, 5, 12, 13, 14, 21, 22, 23…. (n//3)%3==1인 부분이 공백

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import sys

input = sys.stdin.readline

N = int(input())
arr = [['*'] * N for _ in range(N)] # output array 생성

temp = N
cnt = 0
while temp != 1: # 입력받은 n이 3의 몇승?
temp /= 3
cnt += 1


'''
1, 4, 7, 10, 13, 16, 19, 22, 25 .... 3으로 나눈 나머지가 1인 부분이 공백
전체를 봤을때, 3줄씩 한 세트라고 하면, 3, 4, 5, 12, 13, 14, 21, 22, 23.... (n//3)%3==1인 부분이 공백
'''
for i in range(cnt):
idx = []
for j in range(N):
if (j // 3 ** i) % 3 == 1:
idx.append(j)
for row in idx:
for col in idx:
arr[row][col] = ' '

print('\n'.join([''.join([str(i) for i in row]) for row in arr]))

Author

Chaehyeon Lee

Posted on

2021-04-13

Updated on

2021-04-13

Licensed under

댓글