본문 바로가기

CodingTest/Baekjun Online Judge

[ BOJ / 파이썬 ] 2447 별 찍기

|  제출 코드  |

 

import sys
input = sys.stdin.readline

n = int(input())

stars = [[" "]*n for _ in range(n)]

def draw_block(k, x, y):

  if k == 1:
    stars[x][y] = '*'
    return
    
  for i in range(3):
    for j in range(3): 
      if i == 1 and j == 1:
        continue
      draw_block(k//3, x+(k//3)*i, y+(k//3)*j)
        
        
draw_block(n, 0, 0)

for s in stars:
  print(''.join(s))

 

 

뭐 정답 처리는 되긴 했다. 그런데 백퍼센트 내 힘으로 푼게 아니라서 찝찝하다. 대신 설명을 자세히 남겨야겠다.

일단 내가 문제가 되었던 부분은 

 

1.

k == 1일 때, 배열에 값을 저장하고 계속 반복해서 저장하는 방식이 아니라

그 때마다 바로 프린트를 했었다. 그래서 재귀적으로 값이 출력되지 않았다.

2. 

값이 저장되어야한다는 것을 알았을 때 공백을 해결하는 방식에 대해서 이해가 가지 않았다. 검색하니 해당 시점에서는 continue처리를 해서 그냥 비워버리는 것을 알아서 차용했다.

 

 

분기들은 잘 나눴는데, 각각 시점에서 어떤 행동을 해야할 지에 대한 정의가 잘 되지 않았다. 전체적인 흐름 파악이 아직 미숙한 것 같다.

 

 

숫자는 k 를 뜻한다.

 

이렇게 찍어보면 더 눈에 띄는데, k가 1까지 갔을 때, 만약 큰 조건 기준으로도 그려지지 않아야한다면, 그려지는 과정이 생략되고 넘어가는 걸 확인할 수 있다.

 

 

 

|  제출 2  |

 

import sys
input = sys.stdin.readline

n = int(input())

template = [['*','*','*'],['*',' ','*'],['*','*','*']]


def recursive(x, y, n):
  if n == 3:
    for i in range(n):
      for j in range(n):
        result[x+i][y+j] = template[i][j]
    return

  for i in range(3):
    for j in range(3):
      if i != 1 or j != 1:
        recursive(x+i*(n//3), y+j*(n//3), n//3)
      else:
        continue



if n == 3:
  for t in template:
    print(''.join(t))
else:
  result = [[" "] * n for _ in range(n)]
  recursive(0, 0, n)

  for r in result:
    print(''.join(r))

 

: 다시 푸니까 완전히 이해가 된다. 

: 해당 문제 키 포인트를 조금 안 것 같다. 

: 슬슬 문제가 규격화되었다.

 

1. 일단 출력할 전체 배열을 잡아준다. 이건 공백으로 미리 설정한다.

 

2. 그리고 만약 출력해야할 포인트가 오면 그 때 재귀적으로 들어간다.

 

3. 쭉쭉 들어가서 가장 작은 값이 오면 해당 도형 가장 좌상단 기준으로 채워준다. 

 

4.  보통 출력해야할 포인트는 (재귀적으로 끊어갈 포인트는) 배수가 되므로 줄여나가면 된다. 물론 반대의 경우도 있다. (그게 다음 별찍기 문제 게시글)

 

 

 

참고블로그

https://ithansiyeon.tistory.com/12

 

[백준] 2447번 [재귀함수] 별 찍기 - 10

📌 [백준 2447번 별 찍기 - 10] 문제 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고,

ithansiyeon.tistory.com