jyamethyst21 님의 블로그

백준 2446번- '별 찍기 - 9' (PYTHON 풀이) 본문

CODING 💻

백준 2446번- '별 찍기 - 9' (PYTHON 풀이)

jyamethyst21 2025. 11. 27. 01:57

문제:

오랜만에 별찍기 문제를 가지고 왔다.

역피라미드+피라미드 모양인데, 이번에도 역시 규칙을 찾아야 쉽게 풀 수 있다.

역피라미드 모양
피라미드 모양

필자는 쉽게 생각해서 앞서 말한 것처럼 역피라미드+피라미드 모양이니까 두개로 나눠서 별을 찍자고 생각했다. 즉, 역피라미드 모양인 맨 윗줄부터 별이 한개만 찍히는 곳까지 찢어서 코드를 짜고, 나머지 별이 3개부터 시작되는 부분을 피라미드 모양으로 잡고 찢어서 총 for문을 두개썼다. 물론 더 짧게 풀 수도 있을 것 같다.

 

먼저, 역피라미드 모양을 보면 별의 개수가 2*N-1개에서 시작해서 2개씩 줄어들고있다. 그리고 그 줄어든 별의 위치에는 공백이 입력된다.

반대로 피라미드 모양은 별의 개수가 1부터 시작해서 2*N-1까지 2개씩 늘어나고 있다. 이 두가지를 코드를 두개로 나눠서 공백을 찍는 변수 따로, *을 찍는 변수를 따로(for문의 i,j) 두고 print문을 작성하면 된다.

이렇게 설명하면 이해가 힘들 수 있으니 바로 코드를 가지고 와보겠다.

 

풀이:

N = int(input())
b = 0

for i in range(N*2-1, 0, -2):
    print(" " * b + "*" * i)
    b += 1
b -= 2
for j in range(3, N*2+1, 2):
    print(" " * b + "*" * j)
    b -= 1

우선 필자는 b를 공백의 개수를 담는 변수로 선언하였다.

그리고 반복문을 돌려서 앞서 말한 것처럼 별의 개수는 N*2-1부터 시작되니까 시작을 그렇게 잡고 2개씩 줄어드니까 증감수를 -2로 두어서 반복문을 돌렸다. 여기서 for문은 별을 찍기 위한 로직이고 i가 별 개수를 의미한다.

그 다음 i, b를 이용해서 프린트문을 작성한다. b가(공백) 첫번째줄에서는 0개 그 다음부터는 1씩 늘어나기 때문에 프린트문을 적은 뒤에 반드시 +1을 해준다. 이렇게 반복하면 별의 개수가 N*2-1부터 1까지 찍히는 로직이 완성되고 역피라미드 모양이 출력된다.

 

그 다음 피라미드 부분을 그리기 위해 b를 -2 해준다. 왜냐하면 아래쪽 첫 줄의 별 개수는 항상 3개, 즉 윗부분 마지막 줄보다 별이 2개 증가하므로 공백이 1칸 줄어들어야 하고, 또 한 줄 내려가므로 총 2칸 줄어들어야 하기 때문이다.

그 후 별이 3개부터 시작되는 피라미드 모양을 만들어줘야한다. 그래서 마찬가지로 for문을 적고 이번엔 별이 3개부터 시작되니 3부터 시작해서 N*2-1까지 찍히도록 끝 수를 정하고(N*2+1으로 적어야 N*2-1이 됨) 이번엔 2개씩 늘어나므로 +2를 증감수로 두어 반복문을 돌린다. 

 

그러면 아래와 같이 예쁘게 결과가 출력된다. (N이 5일 시)