백준

백준 2444번

rabbit-jun 2025. 1. 23. 13:33

문제

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

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

예제 입력 1

5

예제 출력 1

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *
n,*_ = map(int, input())
k =[ '*'*(2*i-1) for i in range(1, n+1)]
rk =k[::-1][1:]

for i in k:
    print('{0:^{1}}'.format(i,len(k)*2-1))
for j in rk:
    print('{0:^{1}}'.format(j,len(k)*2-1))

처음에 이렇게 했다.
그런데 틀렸다고 한다.

정수 하나를 받는데 map()을 사용해서 억지로 한 결과 에러가 난건가?

n = int(input())

for i in range(1, n+1):
    stars = '*'*(2* i -1)
    print('{0:^{1}}'.format(stars, 2*n-1))

for i in range(n-1,0,-1):
    stars = '*'*(2* i -1)
    print('{0:^{1}}'.format(stars, 2*n-1))

그래서 map() 없애고 그리고 리스트 없이 그냥 range()로만 했다.

그런데 출력 형식이 잘못됐다고 한다.

최종 정답

n = int(input())

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

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

출력을 드래그 하면 뭐가 원인 이었는지 알게 된다.

최종 출력

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

잘못된 출력

    *    
   ***   
  *****  
 ******* 
*********
 ******* 
  *****  
   ***   
    *    

차이를 알겠나?

공백을 점으로 나타내면 그 차이를 쉽게 알 수 있다.

최종 출력

....*.
...***.
..*****.
.*******.
*********.
.*******.
..*****.
...***.
....*

잘못된 출력

....*....
...***...
..*****..
.*******.
*********
.*******.
..*****..
...***...
....*....

공백이 숨겨진 함정이였던 것...

다른 사람의 풀이

n=int(input())
for i in range(1-n, n, 1):
    print(' '*abs(i)+'*'*abs(1-2*n+2*abs(i)))

abs()함수는 절대값으로 바꿔주는 함수다.
range()는 범위를 나타내니 처음이 음수여도 상관이 없나보다.
'*'을 곱하는 과정이 색다르다.
어쨌든 별은 늘어났다가 줄어든다.
별은 결국 2씩 늘어난다.
이걸 염두하면
2(lil-n)+1, 처음 괄호 안을 같게 만들면 i가 변함에 따라 괄호 안은 그 값이 1씩 증가하다 0을 지나면서 줄어들고 전체적으로는 2씩 계속 증가하다가 줄어든다.
어찌 이런 생각을 했는지 정말 똑똑하다.

n = int(input())
for i in range(1 - n, n):
    print(" " * abs(i) + "*" * (2 * (n - abs(i)) - 1))

이것도 같은 메커니즘인데 우리가 흔히 아는 2d-1의 형식이라 이게 더 쉬워 보인다.
개인적으로 이게 더 잘 짜여진것 같다.
이러면 굳이 abs()를 한번 더 사용할 필요도 없다.

반응형