🖥️ 시작하며
문제 링크 : 2444번: 별 찍기 - 7 (acmicpc.net)
별을 출력하는 간단한 문제다. 별 찍기 문제는 대부분 수학 문제인 경우가 많다.
이번 문제도 결이 비슷하다. 문제에서 2 x N - 1번째 줄까지 차례대로 별을 출력한다 했고, 예시를 5로 주었다. N이 5라면 9줄이 출력되어야 하고, 1 - 3 - 5 - 7 - 9 - 7 - 5 - 3 - 1개의 별이 출력되어야 한다.
잘 보면, 별이 찍힌 앞의 공백이 4 -> 0 -> 4로 늘었다가 줄어드는 것을 볼 수 있다.
이를 위해 우선 처음에 공백을 색칠해주자.
for i in range(1, N): for _ in range(N - i): print(" ", end="")
- 아래 코드를 1부터 5까지 반복한다.
- 공백을 채우는 코드를 5 - i번 반복한다. 여기서 i는 부모 for문에서 받아오므로 1부터 시작하게 되므로, range가 4 ~ 1이 된다.
이제 별을 찍어야 한다. 별은 앞서 말했듯이 1 - 3 - 5 - 7 ... 개를 찍어야 하므로, 간단하게 print문에서 곱해 출력하자.
for i in range(1, N): for _ in range(N - i): print(" ", end="") print("*" * ((i * 2) - 1))
여기까지 코드를 실행시키면 아래와 같은 결과가 나온다.
* *** ***** *******
앞에 공백이 4, 3, 2, 1개에 별이 1, 3, 5, 7개가 잘 찍혀 있다.
이제 아래를 채우는 것은 위의 별을 채웠으니 쉽게 할 수 있다.
for i in range(N, 0, -1): for _ in range(N - i): print(" ", end="") print("*" * ((i * 2) - 1))
- 위의 별과는 달리 역순으로 해야 하므로 for문에
1
인자를 준다.
N
부터 시작했으니N - i
만큼 공백을 똑같이 찍는다. 여기서는 1부터 4까지 늘어난다. 그러나 맨 처음 반복문에서는 N과 i가 같은 수가 되므로 별만 찍히게 된다.
- 별을 찍는 로직은 똑같다.
아래는 코드 전문이다.
import sys input = sys.stdin.readline if __name__ == "__main__": N = int(input()) for i in range(1, N): for _ in range(N - i): print(" ", end="") print("*" * ((i * 2) - 1)) for i in range(N, 0, -1): for _ in range(N - i): print(" ", end="") print("*" * ((i * 2) - 1))
소감
인터넷을 찾아보니 반복문을 한번씩만 쓰고 print문에서 공백을 곱하는 방법도 있었다. 파이썬 다운 방법을 공부해야겠다는 생각이 들었다.
댓글