본문 바로가기

CodingTest/Baekjun Online Judge

[ BOJ / 파이썬 ] 2447. 별 찍기 - 11

아 .. 요게 안 되네 진짜 ㅠㅜㅠ 싶어서 꽤 오래 걸렸다.

접근법은 알겠는데 묘하게 구현에서 뻑나서 결국 몇 개월 전 스스로 풀었던 풀이를 보고 완성했다.

 

이번에 못 해낸 이유는 재귀에서 조건에 만족했을 때 바로 프린팅을 찍으려고 한 점.

재귀 도는 순서상 프린트를 한 번에 하는게 안 된다. 

그래서 미리 같은 사이즈의 결과 배열을 만들어두고, 재귀함수를 돌면서 가장 말단에 갔을 때 결과 배열을 업데이트하고 마지막에 완성된 결과물을 한 번에 프린팅해야한다.

 

해당 정답 코드.

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)

 

여기서도 마찬가지로 n//3 을 매 재귀 호출마다 중첩해서 반복하고 있어서 마찬가지로 코드 정리를 한 번 하기로 했다.

일단 그 부분을 n//3을 변수에 넣어주었다.

 

수정 후 코드.

import sys
input = sys.stdin.readline

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

def drawStar(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

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

n = int(input())
result = [[" "] * n for _ in range(n)]
drawStar(0, 0, n)

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

860ms -> 636ms 로 줄었다.

그리고 또 말단 (n==3)일 때 n변수에 굳이 접근할 필요 없지 않나 싶어서 숫자 값으로 변경했다.

 

수정 후 코드.

import sys
input = sys.stdin.readline

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

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

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

n = int(input())
result = [[" "] * n for _ in range(n)]
drawStar(0, 0, n)

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

636ms -> 624ms 로 또 소폭 감소했다.

 

 

지금 계속 재귀로 도형에 접근하는 유형의 문제를 푸는 중인데.. 음.. 배열의 인덱스 부분에서 살짝 살짝 실수를 하는데 이걸 줄이는게 중요할 것 같다.