[Python] 백준 알고리즘 온라인 저지 2257번 별 찍기 - 10
https://www.acmicpc.net/problem/2447
개인적으로 어려운 문제였다 여러 풀이들을 참조했고 그 풀이를 토대로 정리하였다.
- 코드
def counting_star(N):
matrix = []
for i in range(3 * len(N)):
if i // len(N) == 1:
matrix.append(N[i % len(N)] + " " * len(N) + N[i % len(N)])
else:
matrix.append(N[i % len(N)] * 3)
return (list(matrix))
star = ["***", "* *", "***"]
N = int(input())
k = 0
while N != 3:
N = int(N/3)
k += 1
for i in range(k):
star = counting_star(star)
for i in star:
print(i)
프랙탈
왼쪽 그림은 N이 9일 때의 출력이다 즉 N이 3일 때의 출력의 모양을 가지고 가로 N/3 세로 N/3의 길이를 가지고 가운데를 비우는 구조를 반복하는 것이라고 생각하면 된다.
부분의 구조를 가지고 계속 반복하여 전체의 구조를 만드는 프랙탈 구조이다.
쉽게 생각하자면 star라는 리스트의 별들을 곱하고 비우며 입력받은 값의 구조를 만든다고 생각했다.
풀이
코드는 크게 함수 부분, 입력과 초기화, for문 부분으로 나눠진다.
- 입력과 초기화
- 이 부분에서는 star리스트와 입력 값 그리고 k 값을 구해준다.
- for문
- k값을 이용하여 재귀 함수를 이용하는 부분
- 재귀 함수를 반복할 때마다 별의 개수가 줄마다 3배씩 늘어나고 늘어난 별의 개수를 star 리스트에 대입한다.
- N이 3이면 바로 마지막 for문으로 들어가 star 리스트를 한 줄씩 출력한다.
- 함수부분
- 우선 matrix라는 리스트를 선언하고 별이 3배씩 늘어나기 때문에 for문을 이용해 인자로 전달된 리스트의 길이 * 3만큼 반복한다
- 인자로 전달된 리스트의 길이로 나눈 몫이 1인 경우(중간의 빈칸 범위) - 해당 빈칸의 개수만큼 중간에 추가해준다.
- else의 경우 리스트에 저장되어있는 별의 개수 * 3배 만큼 추가
- 위의 과정을 거친 matrix를 반환
결과적으로 star리스트를 for문을 이용해 한줄씩 출력하게 된다.
풀이 결과
'알고리즘' 카테고리의 다른 글
백준 2231번 분해합 파이썬 풀이 (0) | 2022.01.09 |
---|---|
백준 2798번 블랙잭 파이썬 풀이 (0) | 2022.01.07 |
백준 11729 하노이 탑 이동 순서 파이썬 풀이 (0) | 2022.01.04 |
10870번 피보나치 수 5 파이썬 풀이 (0) | 2022.01.02 |
10872번 팩토리얼 파이썬 풀이 (0) | 2022.01.01 |