
별 찍기 - 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)

내가 처음에 썼던 방식과 비슷한 사고방식으로 풀이할 수 있을 것 같다.
'***', '* *', '***' 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)
N = 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%)
'PS > BOJ' 카테고리의 다른 글
(백준, 파이썬, 다시) 함수와 정렬 (0) | 2022.06.18 |
---|---|
(백준, 파이썬) 2차원 Array / 세로 읽기 / 색종이 (0) | 2022.06.17 |
(백준, 파이썬) 안녕이라고 말하지 말라고 말하지 말라고 말하지 말라고 말하지 말라고 말하지 말라고 말하지 마 (0) | 2022.06.12 |
(백준, 파이썬) 9020 - 골드바흐흑님의 추측 (0) | 2022.06.11 |
(백준, 파이썬) 베르뜨랑 공혁준 (0) | 2022.06.10 |