백준
백준 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()를 한번 더 사용할 필요도 없다.
반응형