728x90
https://www.acmicpc.net/problem/10994
22/10/02
흔하디 흔한 별 찍기 문제로, 재귀로도 구현할 수 있지만 그냥 규칙을 찾아서 이중 for문으로 구현하였다.
문제 접근 방식:
먼저, 나는 위와 아래의 모습이 가운데 선을 기준으로 대칭을 이루고 있다는 사실을 발견했다.
때문에 위의 절반까지만 출력하고, 아래 절반은 위의 절반의 코드를 그대로 인덱스만 거꾸로 한 채 출력하면 될 것이라고 생각했다.
칸 수를 보면, 1을 입력받을 때 위의 절반의 칸 수가 1, 2를 입력받을 때는 3, 3을 입력받을 때는 5이므로, 가로를 출력하는 i가 2*n - 1이 된다는 것을 알 수 있다.
또한, 짝수번째 가로줄(0-index로 따졌을 때에는 홀수번째)에는 가운데가 항상 비어있고 그 주변이 공백과 별로만 이루어져 있다.
근데 그 줄의 별의 개수는 가로줄의 번호와 같다.
또한, 홀수번째 가로줄(0-index로 따졌을 때에는 짝수번째)에는 가운데 줄을 연속해서 쭉 출력하고, 그 주변을 공백과 별이 감싸고 있는 형태이다.
그 공백의 개수는 (가로줄의 번호 - 1)과 같다.(1-index기준)
이 규칙을 참고하여 구현하였다.
아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.
더보기
# 10994번 별 찍기 - 19
# 구현, 재귀
n = int(input())
for i in range(2*n-1):
if i == 0:
print('*'*(4*n-3))
elif i % 2 == 1:
print('* '*(i//2+1), end = '')
print(' '*(4*(n-(i+1)//2)-3), end = '')
print(' *'*(i//2+1))
else:
print('* '*(i//2), end = '')
print('*'*(4*(n-(i+1)//2)-3), end = '')
print(' *'*(i//2))
for i in range(2*n-3, -1, -1):
if i == 0:
print('*'*(4*n-3))
elif i % 2 == 1:
print('* '*(i//2+1), end = '')
print(' '*(4*(n-(i+1)//2)-3), end = '')
print(' *'*(i//2+1))
else:
print('* '*(i//2), end = '')
print('*'*(4*(n-(i+1)//2)-3), end = '')
print(' *'*(i//2))
'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글
[Python] 21317번 징검다리 건너기 (0) | 2022.10.28 |
---|---|
[Python] 11057번 오르막 수 (0) | 2022.10.28 |
[Python] 20040번 사이클 게임 (0) | 2022.10.25 |
[Python] 7569번 토마토 (0) | 2022.10.24 |
[Python] 4821번 페이지 세기 (0) | 2022.10.24 |