본문 바로가기
문제 풀이/백준

[백준] 10997번 별찍기 22

by ginny. 2024. 7. 9.

[아이디어]

할 만 하다고 생각했는데.. 계속 이상하게 찍혀서 아래 블로그 참고해서 풀었다

 

https://zoosso.tistory.com/438

 

[BOJ] 백준 10997 별 찍기 - 22

출처: 출처: https://www.acmicpc.net/problem/10997 Input 2 Output ***** * * *** * * * * * * * * ***** 가로/세로 길이의 변화 (※ n = 1인 초기값 제외) (가로) 1 → 5 → 9 → 13 → 4(n-1) + 1 = 4n - 3 (세로) 1 → 7 → 11 → 15 →

zoosso.tistory.com

 

 

각 시작점에서 아래 과정으로 별을 그려나갑니다.

① 왼쪽으로 width만큼 별 그리기

② 아래쪽으로 height만큼 별 그리기

③ 오른쪽으로 width만큼 별 그리기

④ 위로 height - 2 만큼 별 그리기

⑤ 왼쪽으로 별 1개를 그립니다.

 n > 3일 때는 위의 과정을 수행한 후 다음 단계의 시작점을 매개변수로 넘겨주면 되지만

     n = 2일 때는 마무리 단계로 세로 방향으로 별 3개를 연속적으로 그려서 종료합니다.

    (※ 입력받은 n = 1인 경우 별 한개만 출력하여 return)

 

 

[해결]

'출력 형식이 잘못되었습니다' 오류가 안나려면..

>> * 하나만 찍힌 줄에 나머지 불필요한 공백을 없애주어야 오류가 안난다..!

 

def print_star(n,new_x,new_y):
    global arr
    col=4*n-3
    row=col+2
    
    for i in range(col):            #맨위,아래
        arr[new_x][new_y+i]='*'
        arr[new_x+row-1][new_y+i]='*'
    for i in range(1,row-1):        #아래쪽으로 height만큼 찍기
        arr[new_x+i][new_y]='*'
    for i in range(2,row-1):        #위로 height-2만큼 찍기
        arr[new_x+i][new_y+col-1]='*'
    arr[new_x+2][new_y+col-2]='*'   #왼쪽한칸 찍기
    
    if n==2:    #중간3개 연속찍기
        arr[new_x+2][new_y+2]='*'
        arr[new_x+3][new_y+2]='*'
        arr[new_x+4][new_y+2]='*'
        return
    print_star(n-1,new_x+2,new_y+2)
    
import sys
input = sys.stdin.readline

n=int(input().rstrip())
col=4*n-3
row=col+2
arr=[[' ' for _ in range(col)] for __ in range(row)]   

if n==1:
    print('*')
else:
    print_star(n,0,0)
    for i in range(1,col):		#출력형식 예외처리, *한개만 남기고 공백 제거
        arr[1][i]=''
    for i in range(row):
        print(''.join(arr[i]))

댓글