IT 공부/코딩테스트
[백준 2445번] 별 찍기 - 8 - 파이썬
unnimm
2023. 7. 29. 16:02
해설
처음 문제에 접근했을 때
일단 반을 짤라서 접근하고 나머지는 뒤집으면 되겠다. 싶었다.
*
**
***
****
*****
이 문제를 응용해서 풀면 될 것 같다는 생각을 했다.
이 코드는
n = int(input())
for i in range(1, n+1):
for j in range(0, i):
print('*', end="")
print()
for i in range(1, n+1):
for j in range(0, i):
print('*', end="")
print()
이런식으로 문제를 풀면 된다.
근데, 지금 문제는 중간 빈칸이 있고 양 끝에 별이 찍히는 것이니까
매 반복마다 띄어쓰기를 어떻게 찍지? 생각했다.
그럼 띄어쓰기는 어떤 반복이 있지? 생각하니
8->6->4->2->0 이렇게 찍히는 걸 파악했고,
양 끝에 찍히는 *은 첫줄부터 1,2,3,4,5이런식으로 찍히되, 양쪽에 다 찍혀야한다는 걸 알았다.
그럼 일단 반복문을 쓸테고
그러면
n=5를 대입하면
띄어쓰기 먼저 보면
i=1일 때, 띄어쓰기는 4 * ' '
i=2일 때, 띄어쓰기는 3 * ' '
i=3일 때, 띄어쓰기는 2 * ' '
i=4일 때, 띄어쓰기는 1 * ' '
n과 i의 관계를 보았을 때, (n-i) * ' '
이걸 별 사이에 넣는 함수가 없을까 구글 검색을 해보니
sep 함수가 있었고
이 함수는 문자열과 문자열 사이에 어떤 것을 넣어주는 함수이었다.
그래서
print('*'*i, '*'*i, sep=' ' * (n-i), end='')
별을 보면
i = 1일때, *은 양쪽으로부터 1개씩
i = 2일때, *은 양쪽으로부터 2개씩
i = 3일때, *은 양쪽으로부터 3개씩
i = 4일때, *은 양쪽으로부터 4개씩
이니까 i와 *의 규칙을 생각해봤을 때
i*'*'이 된다는 것을 확인
print('*'*i, '*'*i, sep=' ' * (n-i), end='')
밑은 그냥, i=1,2,3,4,5... 이것을
i=5,4,3,2,1... 이렇게 꺼꿀로 돌려주면 됨.
코드
n = int(input())
for i in range(1, n+1):
print('*'*i, '*'*i, sep=' '*(n-i), end='')
print()
for j in range(n-1, 0, -1):
print('*'*j, '*'*j, sep=' ' * (n-j), end='')
print()
for i in range(1, n+1):
print('*'*i, '*'*i, sep=' '*(n-i), end='')
print()
for j in range(n-1, 0, -1):
print('*'*j, '*'*j, sep=' ' * (n-j), end='')
print()
결과
다른 풀이
n = int(input())
for i in range(1, n):
print('*'*i + ' '*2*(n-i) + '*'*i)
for i in range(n, 0, -1):
print('*'*i + ' '*2*(n-i) + '*'*i)
그냥 +로 엮을 수도 있네..ㅎ