practivceAlgorithm/백준

[백준][Python] 2447 별찍기

findTheValue 2021. 7. 17. 14:02

별찍기 같은 경우 분할 정복의 대표적 문제다.

분할 : n=3인 경우로 분할

정복 : n=3인 경우를 해결. (매개변수로 받아오는 값만 어떻게 처리해야 동일한 패턴이 나올까 고민하면됨)

병합 : n=3인 경우의 결과값을 다음 순서에 넣어 확장시키면 재귀적인 프렉탈구조를 만들수 있다.

# 분할 정복 알고리즘 / 분할, 정복, 합치기.

# 정복
# star 배열을 통해 새 matrix를 생성해 반환하는게 목적.
# 반복문에서 3*len(star)로 별이 그려지는 모든 배열을 검사하며 len(star)
# 즉 최초 n의 크기에 따라 빈칸 " "을 추가적으로 삽입하는 방식을 차용한다.
# (n=9일때 3으로 나눠 몫이 1인 index = 1 요소의 가운데 )
def conquer(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))

# default로 n=3일때 배열과 k값을 미리 줌.
star = ["***","* *","***"]
n = int(input())
k = 0

# 분할(3의k승형으로 분할. 최종적으로 n=3인 모형에 k값만 가지고 간다.
while n != 3:
    n = int(n / 3)
    k += 1

# 조합
# n=3일때 conquer의 결과를 확장시켜 n=9를 그린다. k승만큼 반복한다.
for i in range(k):
    star = conquer(star)
for i in star:
    print(i)

 

 

 

'practivceAlgorithm > 백준' 카테고리의 다른 글

[백준][Python] 17123 배열놀이  (0) 2021.07.17
[백준][Python] 11060 점프점프  (0) 2021.07.17
[백준][Python] 9242 폭탄해제  (0) 2021.07.17
[백준][Python] 4446 ROT12  (1) 2021.07.17
[백준][Python] 2529 부등호  (0) 2021.07.16