[BOJ] 2444 | 별찍기

Gaanii·2024년 10월 9일
0

Problem Solving

목록 보기
14/210
post-thumbnail

아래 백준 로고를 클릭하면 해당 문제로 이동합니다 😀

BOJ 로고



풀이과정


디미고에서 진짜 지겹게 했던 별찍기였다 ...
1학년때는 별찍기조차 이해가 어려웠는데 지금은 뭐 ... 누워서 떡먹기죠 ~


1. 큰 for문 2개 사용하기

해당 문제는 마름모를 출력하는 문제로, 위쪽 정삼각형을 출력하는데 for문 1개를 사용하고,
아래쪽 정삼각형을 출력하는데 다른 for문을 사용해 크게 2개의 for문을 사용할 수 있다.

위쪽 정삼각형을 출력할 때 고려해야할 공백과 별의 개수이다.

iter공백 개수별 개수
041
133
225
317
409

문제 예시의 경우 n=5이므로, 공백개수는 n-(i+1)이고 별의 개수는 2i + 1가 된다.


아래쪽 정삼각형을 출력할 때 고려해야할 공백과 별의 개수이다.

iter공백 개수별 개수
017
125
233
341

위쪽 정삼각형과 아래쪽 정삼각형에서 별의 개수가 9인 부분은 겹치게 되므로, 제외하고 생각해보자!
문제 예시의 경우 n=5이므로, 공백개수는 i+1이고 별의 개수는 (2n -1) - 2(i+1)가 된다.


2. 큰 for문 1개 사용

반복 범위를 2n - 1로 설정하여 위 아래 끊어서 출력하지 않고, for문 안에서 if문으로 조건을 작성해 출력을 조정해줬다.

문제 예시의 경우 n=5일때 전체 for문에서 고려해야할 공백과 별의 개수이다.

iter공백 개수별 개수
041
133
225
317
409
517
625
733
841

이 경우, i < n 조건을 걸면 위쪽 정삼각형과 아래쪽 정삼각형을 나눌 수 있다.

위 조건이 참인 경우, 공백 개수는 n-i-1이고 별의 개수는 2i + 1이다.
하지만 조건이 거짓인 경우, 공백 개수는 i-n+1이고 별의 개수는 (2n-1) - 2*(i-n+1)이다.

코드


1. for문 2개 사용

n = int(input())

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

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

2. for문 1개 사용

출력 시에는 위에 코드처럼 이중 포문을 사용해도 되지만 간단하게 작성해봤다.

for i in range(2*n - 1):
    if i < n :
        print(' ' * (n-i-1), end = '')
        print('*' * (2*i+1))
    else :
        print(' ' * (i-n+1), end = '')
        print('*' * ((2*n -1) - (2*(i-n+1))))


결과


2444맞았습니다

0개의 댓글