Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

행복한 개구리

백준 21.12.12. 2447번 - 별 찍기 - 10 본문

Algorithm/BaekJoon

백준 21.12.12. 2447번 - 별 찍기 - 10

HappyFrog 2021. 12. 14. 23:16

* = 검은칸 // 빈칸 = 흰칸

def drawStars(n):

    global Map

    if n == 3:
        Map[0][:3] = Map[2][:3] = [1] * 3
        Map[1][:3] = [1, 0, 1]
        return

    a = n//3
    drawStars(a)
    for i in range(3):
        for j in range(3):
            if i == 1 and j == 1:
                continue
            for k in range(a):
                Map[a*i+k][a*j: a*(j+1)] = Map[k][:a]


N = int(input())

Map = [[0 for _ in range(N)] for _ in range(N)]

drawStars(N)

for i in Map:
    for j in i:
        if j:
            print('*', end='')
        else:
            print(" ", end="")
    print()

 

  • 함수 draw_star(n)를 정의해줍니다.
  • 함수 안에서 Map을 다룰 수 있도록 global로 만들어줍니다.
  • N의 최솟값인 3일 때 처음 패턴을 만들어 낼 수 있도록 if조건문을 통해 지정해줍니다.
  • 해당 문제의 핵심은 Fn의 패턴은 Fn-1의 패턴을 3x3 배열로 나열한 뒤 정가운데는 비워주는 데에 있습니다.
  • N이 3의 몇제곱이든 재귀를 통해 Map이 처음 패턴을 가질 수 있도록 draw_star를 재귀로 실행해줍니다.
  • 끝나면 Fn-1패턴을 가지고 Fn의 패턴을 구하는 중첩 반복문을 실행합니다.
  • 위에서 언급했듯이 Fn의 패턴은 Fn-1의 패턴을 3x3배열로 나열하는 게 기본적인 틀입니다.
  • 따라서 for i in range(3), for j in range(3)을 통해 3x3틀을 잡아줍니다.
  • 3x3 배열의 정 가운데는 비어있으므로 i와 j가 1일 때는 continue를 하여 스킵해줍니다.
    • => 이렇게 해도 가능한 이유는 Map은 처음부터 모든 리스트의 요소가 0이기 때문입니다. 따라서 아무것도 건들지 않고 넘기면 0인 상태로 남게 됩니다.
  • 가운데가 아닌 부분들은 일정한 패턴을 가지므로 그에 따라 할당해주면 됩니다.
    • => 크게 3x3 배열로 나누어서 보면 편합니다.
    • 1 2 3
      4 5 6
      7 8 9
    • 표를 다음과 같이 크게 봅시다.
    • 만약 입력받은 N이 27이라면 Map은 27 x 27 크기일 것입니다.
    • 이 표를 3x3 배열이라고 나누어 생각해본다면 5번 칸을 제외한 각 칸은 N이 9일 때의 결괏값으로 이루어져 있습니다.
    • 그리고 각 칸은 길이 9짜리 리스트 9개로 이루어져 있는 리스트입니다.
      1. * = 1, 빈칸 = 0 입니다.
    • 위 표가 반복되는 형태이므로 1번 칸의 맨 윗줄은 5번을 제외한 맨 윗줄과 같고 2번째 줄 또한 5번을 제외한 나머지 칸의 2번째 줄과 같으며 ... 맨 아랫줄까지 같은 패턴으로 진행되는 형태입니다.
  • 각 칸의 [a*i+k] 번째 리스트의 [a*j : a*(j+1)] 범위의 요소들은 1번 칸의 같은 값을 가진 리스트인 [k] 번째 리스트의 [:a] 요소들과 같으므로 작성해줍니다.
    • => 27x27 맵을 구할 때 사용되는 9x9크기의 맵은 재귀 함수를 통해 먼저 구해집니다.
    • => N이 최솟값인 3일 때는 return을 통해 함수가 바로 끝납니다.
  • 함수를 끝낸 뒤 중첩 반복문을 통해 출력합니다.
    • 리스트의 요소의 값이 1(True)이라면 *을 출력하고 줄 바꿈, 띄어쓰기 등이 되지 않게 끝을 ''또는 ""로 맺어줍니다.
    • 그리고 한 리스트의 출력이 끝났다면 줄 바꿈을 위해 print()를 해줍니다.

 


https://study-all-night.tistory.com/5

 

[백준 2447번] 별찍기 10 - Python(파이썬) 자세한 풀이

1. 문제 백준 2447 번 https://www.acmicpc.net/problem/2447 2. 아이디어  (1) n = 3^1 일때를 생각해보자! (^ 기호는 제곱을 나타냅니다. ex) 2^2 = 4, 2^3 = 8) 다음과 같이 별이 찍힌다는 것을 알 수 있다...

study-all-night.tistory.com

위 블로그의 게시글을 보며 이해하고 다시 작성해보았습니다.

그리고 global Map은 안 해도 출력이 정상적으로 나오는데 전역 설정하신데 이유가 있는지 궁금하네요