본문 바로가기

알고리즘/백준 문제 풀이

[Python] 10994번 별 찍기 - 19

728x90

https://www.acmicpc.net/problem/10994

 

10994번: 별 찍기 - 19

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

www.acmicpc.net


 

22/10/02

 

 

흔하디 흔한 별 찍기 문제로, 재귀로도 구현할 수 있지만 그냥 규칙을 찾아서 이중 for문으로 구현하였다.


 

문제 접근 방식:

 

 

먼저, 나는 위와 아래의 모습이 가운데 선을 기준으로 대칭을 이루고 있다는 사실을 발견했다.

 

때문에 위의 절반까지만 출력하고, 아래 절반은 위의 절반의 코드를 그대로 인덱스만 거꾸로 한 채 출력하면 될 것이라고 생각했다.

 

칸 수를 보면, 1을 입력받을 때 위의 절반의 칸 수가 1, 2를 입력받을 때는 3, 3을 입력받을 때는 5이므로, 가로를 출력하는 i가 2*n - 1이 된다는 것을 알 수 있다.

 

또한, 짝수번째 가로줄(0-index로 따졌을 때에는 홀수번째)에는 가운데가 항상 비어있고 그 주변이 공백과 별로만 이루어져 있다.

 

근데 그 줄의 별의 개수는 가로줄의 번호와 같다.

 

또한, 홀수번째 가로줄(0-index로 따졌을 때에는 짝수번째)에는 가운데 줄을 연속해서 쭉 출력하고, 그 주변을 공백과 별이 감싸고 있는 형태이다.

 

그 공백의 개수는 (가로줄의 번호 - 1)과 같다.(1-index기준)

 

이 규칙을 참고하여 구현하였다.


아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.

더보기
# 10994번 별 찍기 - 19
# 구현, 재귀
n = int(input())
for i in range(2*n-1):
    if i == 0:
        print('*'*(4*n-3))
    elif i % 2 == 1:
        print('* '*(i//2+1), end = '')
        print(' '*(4*(n-(i+1)//2)-3), end = '')
        print(' *'*(i//2+1))
    else:
        print('* '*(i//2), end = '')
        print('*'*(4*(n-(i+1)//2)-3), end = '')
        print(' *'*(i//2))
for i in range(2*n-3, -1, -1):
    if i == 0:
        print('*'*(4*n-3))
    elif i % 2 == 1:
        print('* '*(i//2+1), end = '')
        print(' '*(4*(n-(i+1)//2)-3), end = '')
        print(' *'*(i//2+1))
    else:
        print('* '*(i//2), end = '')
        print('*'*(4*(n-(i+1)//2)-3), end = '')
        print(' *'*(i//2))