2022. 12. 17. 02:08ㆍGold/Gold V
아직 시험이 절반밖에 지나지 않았다. 21일에 마지막 시험이 종료된다.
복수전공 예정인 과목인데다가 교수님에게 빌어넣어서 들어간 과목이다. 망칠 수는 없다. 빌어 넣은 사람에서 빌어먹은 사람이 되기 때문에...
그런고로 적당히 어려운 2447번 풀이를 올리고, 22일부터 왕성한 활동을 하도록 하겠다.
이번 문제는 별 찍기 문제. 무려 골드씩이나 되는 문제다!
그럼 본격적으로 풀이에 돌입해 보자.
문제
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 \(\frac{N}{3}\times\frac{N}{3}\) 정사각형을 크기 \(\frac{N}{3}\)의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
입력
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 \(N=3^k\)이며, 이때 1≤k<8이다.
예제 입력)
27
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
예제 출력)
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
********* *********
* ** ** * * ** ** *
********* *********
*** *** *** ***
* * * * * * * *
*** *** *** ***
********* *********
* ** ** * * ** ** *
********* *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
내 코드
def add_matrix(A,B,C):
ans = [None]*len(A)
for _ in range(len(A)):
ans[_] = A[_]+B[_]+C[_]
return ans
def sponge(n):
if n==3: return [['*']*3, ['*',' ','*'], ['*']*3]
else:
r = n//3
u,c = [[' ']*r for i in range(r)], sponge(r)
ans = add_matrix(c, c, c)
ans = ans+add_matrix(c, u, c)
ans = ans+add_matrix(c, c, c)
return ans
sp = sponge(int(input()))
for i in sp: print(''.join(i))
재귀 문제다. 경우의 수가 생각보다 적지만, N=2187까지 가능하기 때문에 직접 손으로 입력하다가는 한 세월이 다 갈 수 있다.
문제의 포인트는 이것이다. N일 때 패턴을 C, N*N짜리 공백을 U라고 두면, 3N일 때 별 모양은 다음과 같다는 것.
CCC
CUC
CCC
그렇다면 N의 패턴으로 3N짜리 패턴을 만들 수 있지 않을까? 당연히 그렇다. 구현이 문제일 뿐.
일단은 CCC든, CUC든 두 개의 2차원 배열을 이어붙이는 쪽으로 코드를 짜는 것이 가장 낫다. 그것이 바로 add_matrix 함수.
이름에서 착각하지는 말자. 이 add_matrix는 세 개의 행렬을 옆으로 이어붙이는 함수다!
그리고 C를 N//3에서의 결과값으로, U를 N//3×N//3짜리 빈칸 행렬로 만든 다음, [CCC, CUC, CCC]의 꼴로 리턴해 주면 끝.
그리고 줄줄이 출력하는 것을 잊지 말자.
이로서 2447번의 풀이를 마친다.
'Gold > Gold V' 카테고리의 다른 글
BOJ 9764 - 서로 다른 자연수의 합 (Python3) (0) | 2023.10.31 |
---|---|
BOJ 27087 - 직육면체 (Python3) (0) | 2023.01.02 |
BOJ 15717 - 떡파이어 (Python3) (0) | 2022.12.04 |
BOJ 18291 - 비요뜨의 징검다리 건너기 (Python3) (0) | 2022.11.25 |
BOJ 11758 - CCW (Python3) (0) | 2022.11.18 |