본문 바로가기
Python 알고리즘 공부/백준 알고리즘 공부

2447: 별 찍기 - 10 (python)

by 두 그루 2023. 1. 14.

https://www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

 

재귀를 이용하여 별을 규칙적으로 출력하는 문제이다.

 

별을 출력하기 위해 아래와 같은 함수을 생각했다. 

 

- 먼저, 주어진 n을 이용하여 원소 모두가 ' '(공백)인 n * n 이차원 배열을 정의한다.

- 함수는 이차원 배열 중 확인할 부분의 제일 왼 & 위쪽의 인덱스인 row, col, 그리고 확인할 범위인 length를 전달받는다.

1. 만약 length가 1이면 이차원 배열의 해당 인덱스의 값을 '*'로 변경한다.

2. 아니라면 확인할 부분을 9 부분으로 나누고, 그 부분 중 중간을 제외하고 다시 함수를 실행시킨다.

3. 함수를 다시 실행시킬 때는 각 부분의 가장 왼 & 위쪽의 인덱스를 row, col로 전달하고, 현재의 length를 3으로 나눈 몫을 length로 전달한다.

# 2447
# 별 찍기 - 10

n = int(input())
graph = [[' '] * n for _ in range(n)]


def divide_and_get_star(row, col, length):
    if length == 1:
        graph[row][col] = '*'
        return
    next_length = length // 3
    divide_and_get_star(row, col, next_length)
    divide_and_get_star(row, col + next_length, next_length)
    divide_and_get_star(row, col + next_length * 2, next_length)
    divide_and_get_star(row + next_length, col, next_length)
    divide_and_get_star(row + next_length, col + next_length * 2, next_length)
    divide_and_get_star(row + next_length * 2, col, next_length)
    divide_and_get_star(row + next_length * 2, col + next_length, next_length)
    divide_and_get_star(row + next_length * 2, col + next_length * 2, next_length)
    return


divide_and_get_star(0, 0, n)
for i in range(n):
    for j in range(n):
        print(graph[i][j], end="")
    print()

 

처음에 출력할 때 모든 원소 사이에 띄어쓰기도 함께 출력해서 바로 통과하지 못 했었다.

댓글