(파이썬)백준 2446. 별 찍기 - 9

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

 

캡처.JPG

 


n = int(input())
k = 0
for i in range(2 * n - 1, 0, -2):
    for j in range(k):
        print(" ", end = '')
    k += 1
    for j in range(i , 0, -1):
        print("*", end = '')
    print("")

k -= 2

for i in range(3, 2 * n, 2):
    for j in range(k):
        print(" ", end = '')
    k -= 1
    for j in range(i):
        print("*", end = '')
    print("")
 

 

별 개수를 줄여나가려면 range를 역순으로 만들어야겠다고 생각했다. 

그러니 n이나 i로는 공백을 찍기가 곤란해서 k라는 문자를 더 만들었다.

 

3행에서 k만큼 공백을 출력한다. 첫 줄엔 공백이 없어야 하므로 반복문 바깥에서 k = 0으로 설정했다. k만큼 공백이 출력되면 k를 늘려 다음 줄엔 공백이 한 칸 더 출력되도록 한다.

6행에서 별을 출력한다. 별이 2 * n - 1 개부터 두 개씩 줄어든다. 그래서 2행에서 range함수의 스텝을 -2로 설정했다.

n이 5라면 i는 9부터 시작한다. 별은 첫째 줄에 9개, 둘째 줄에 7개, 셋째 줄에 5개, 넷째 줄에 3개, 다섯째 줄에 1개 출력된다.

 

n이 5일 때를 계속 예로 들어보자.

2~9행까지의 반복문이 모두 종료되면 마지막 줄에는 공백이 4칸, 별이 하나 출력 된다.  다음 줄에는 공백을 한 칸 줄이고 별을 세 개 출력해야 한다. 그런데 공백을 출력한 후 k가 증가한다. 반복문이 끝난 후 k 값은 5이다. 의미 없이 증가된 k값을 줄어야 하고, 다음 줄을 위해 공백이 하나 줄어야 하므로 10행에서 k에 2를 빼주었다.

이제 별의 개수를 2개씩 늘리면서 똑같이 출력하면 된다.

 

별 차이는 없지만 k를 사용하지 않아도 실행되게 다듬어 봤다.

n = int(input())

for i in range(n, 0, - 1):
    for j in range(n - i):
        print(" ", end = '')
    for j in range(2 * i - 1):
        print("*", end = '')
    print()

for i in range(2, n + 1):
    for j in range(n - i):
        print(" ", end = '')
    for j in range(2 * i - 1):
        print("*", end = '')
    print()​