알고리즘
재귀호출을 통해 별을 찍는다. 가로 4n-3, 세로4n-1인 2차원 배열을 생성한 뒤 함수를 통해 찍어준다. 주의 할 점은 base conditon은 N=1일때 이고 각 호출마다 함수가 실행하고 넘길 모양은 첫행, 첫열, 마지막행, 마지막 열(y축이 1인경우 제외) 하고 가운데 r자 모양이다.
소스코드
# 별 찍기 - 22
n = int(input())
stars = [[" " for i in range(4*n-3)] for j in range(4*n -1)] #배열초기화
def fill(N, x, y):
if N == 1: #기저 조건
stars[x][y] = "*"
return
l1 = 4*N-1
l2 = 4*N-3
#열찍기
for i in range(l1):
stars[x+i][y] = "*"
if i != 1:
stars[x+i][y+l2-1] = "*"
# 행찍기
for i in range(l2):
stars[x][y+i] = "*"
stars[x+l1-1][y+i] = "*"
# 가운데 r자 찍기
stars[x+l1//2][y+l2//2] = "*"
stars[x+l1//2+1][y+l2//2] = "*"
stars[x+2][y+l2-2] = "*"
fill(N-1, x+2, y+2)
fill(n, 0, 0)
if n == 1: #예외처리
print("*")
else: # 2번째 줄 공백 무시해야함 (백준 출력형식에서 드래그 해볼것)
l = len(stars)
for s in range(l):
if s==1:
print("*")
else:
print(''.join(stars[s]))
느낀점
계속 출력형식이 맞지 않는다고 해서 n을 50까지 키웠었다. 하지만, 백준에서는 2번째 줄에 공백이 없는 것을 깨닫고 바로 정답이 되었다. 이런 함정도 있구나...
'백준 문제 풀이' 카테고리의 다른 글
[백준] 1744 "수 묶기" -python (0) | 2024.01.05 |
---|---|
[백준] 7490 "0 만들기" -python (2) | 2024.01.05 |
[백준] 1182 "부분수열의 합" 백트래킹 -python (2) | 2024.01.02 |
[백준] 1874 "스택 수열" -python (0) | 2024.01.02 |
[백준] 11054 "가장 긴 증가하는 부분 수열" -python (1) | 2024.01.02 |