자기계발
백준
2444 · 별 찍기 - 7

백준 2444번 별 찍기 - 7

문제

N(1 이상 100 이하)이 주어지면 첫째 줄부터 2×N-1번째 줄까지 별을 찍는다. 별은 1개에서 시작해 2개씩 늘어 N번째 줄에서 2×N-1개가 되고, 이후 2개씩 줄어든다. 각 줄은 앞쪽에 공백을 넣어 가운데를 맞춘다. 예를 들어 5이면 별이 1, 3, 5, 7, 9, 7, 5, 3, 1개인 9줄이 출력된다.

풀이

전체 줄 수 max_는 2*num-1이고, 별이 가장 많은 줄의 별 개수도 같다. 줄마다 별 개수 value는 1에서 시작해 최대 줄 전까지 2씩 늘고 그다음부터 2씩 줄어든다. 앞쪽 공백 수는 (max_ - value) / 2다.

별이 최대인 줄은 공백이 없으므로 따로 처리하고, 그 줄에서부터 value를 줄이기 시작한다.

# 제시된 숫자 (별 개수가 최대가 되는 라인)
num = int(input())
# 총 라인 수
max_ = 2*num-1
# 별 개수
value = 1
 
# 총 라인수만큼 루프문 생성
for i in range(1, max_+1):
    # 총 라인 수와 별 개수가 다르다면 (공백이 포함된 라인일 경우)
    if max_ != value:
        # 공백 개수 생성
        vacant = int((max_ - value) / 2)
        print(f"{' '*vacant}{'*'*value}")
        # 별 개수가 최대가 되는 라인 이전 줄일 경우
        if num > i:
            value += 2
        # 별 개수가 줄어드는 라인일 경우
        else:
            value -= 2
    else:
        # 별 개수가 최대인 라인(다음 라인부터 별을 2개씩 차감 조정)
        print('*'*max_)
        value -= 2

막혔던 점

처음에는 별 뒤에도 공백을 붙여 출력했더니 출력 형식이 잘못되었다는 결과가 나왔다.

# 문제 발생
f"{' '*vacant}{'*'*value}{' '*vacant}"
 
# 별 뒤에 삽입하던 공백 제거
f"{' '*vacant}{'*'*value}"

별 뒤의 공백을 없애니 통과했다. 이 문제는 줄 끝에 공백이 있으면 오답으로 처리된다.

출처