별 찍기 - 10

(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번째 줄까지 별을 출력한다.

 

예제 입력 : 27

예제 출력:


- 중간에 절은 과정 -

print(star(1))은 잘 출력이 되지만, 2부터 요상해진다.

print(star(2))가 아닌 star(2)값을 통해 문제점을 찾았다.


***\n* *\n******\n* *\n******\n* *\n***\n***\n* *\n*** ***\n* *\n***\n***\n* *\n******\n* *\n******\n* *\n***


한 세트가 알아서 덩이로 찍히는게 아니라 한 문장안에서 엔터가 공유되기 때문에알아서 개행에 신경써주면서 프린트를 해줘야하는 것이었다.

덩이로 찍히듯이 만들 수 있다면 해결할 수 있을 것 같다.

 

아니면 3x3에 별을 꽉 채운 상태에서 별을 빼준다고 생각해본다면?

2차원 배열로 만든 다음에 출력하는 방법이 있나?

있다.

근데 결국 이 방법도 같은 난관에 봉착...할 듯


결국 도움을 빌리기로 했다.

(https://cotak.tistory.com/38)

 

int(input(3)) /'\n'.join() 메소드를 통해 출력할 수 있다.

내가 처음에 썼던 방식과 비슷한 사고방식으로 풀이할 수 있을 것 같다.

9를 인풋하면 다음과 같은 리스트가 나온다.

'***', '* *', '***' 3번해서 3행까지. (3번 해주기)

'***' + ' '*(9//3) + '***' (1 + 공백 + 1번 해주기)

'***', '* *', '***' 3번해서 3행까지. (3번 해주기)

 

즉, 왼쪽에서 오른쪽 방향으로

윗줄에서 아랫줄로 차례대로 그리는 그 값을 리스트화 해주고 (리스트의 재귀였다)

그 리스트 뭉치를 print('\n'.join())로 구현해주는 것이었다.


-맞힌 코드-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import sys
sys.setrecursionlimit(10**6)
 
= int(input())
 
def star(N):
    if N == 1:
        return ['*']    #star(1)의 값.
    
    stars = star(N//3)  #N이 3의 ?승꼴로 인풋되므로 1 - 3 - 9 - 27 ... 꼴로 입력됨
    lst = []
    
    for s in stars:
        lst.append(s*3)
    for s in stars:
        lst.append(s+' '*(N//3)+s)
    for s in stars:
        lst.append(s*3)
    return lst
 
print('\n'.join(star(N)))
cs

생각만 하고있던 블럭 처럼 구현하는 방법을 이번에 알았다.

반드시 다시 풀어봐야할 것.


9번 테마의 4번째까지 총 72개 풀었어.

앞으로 313개의 문제가 남았어. (18.7%)

 

복사했습니다!