티스토리 뷰

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

 

10994번: 별 찍기 - 19

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

www.acmicpc.net

 

 

👩‍💻문제 이해

재귀함수를 이용한 문제는 패턴을 파악하는게 가장 중요하다.

하지만 아직 문제를 보자마자 패턴을 파악하는게 쉽진 않다.

나름대로 재귀함수 문제를 풀 때 로직을 조금 더 쉽게 알아차릴 수 있는 방법을 생각해봤는데,

대부분의 재귀함수는 정의된 함수의 변수를 n이라고 할 때 (n-1)을 변수로 가지는 함수를 호출한다.

따라서 n 일때와 n-1 일 때의 출력을 비교하며 로직을 찾으면 좀 더 쉽게 찾을 수 있을 것이다.

 

 

 

n이 4일 때의 출력을 예로 들어보자면

가장 바깥 쪽의 라인(n) -> 행과 열이 (4*n -3)개 ->  '*' 출력

안쪽 라인 (n-1) -> 가장 바깥 쪽 라인과 비교했을 때 인덱스를 오른쪽으로 +2, 아래쪽으로 +2 한 곳 부터 똑같이 (4*n-3)개의 '*' 가 출력 된다.

그리고 이 과정이 n=1이 될 때까지 반복되고,

n이 1일 경우에는 정중앙에만 '*'가 출력된다.

 

 

 

👩‍💻재귀함수를 사용한 코드 : 성공🌈

n = int(input())
arr = [[' '] * (4*n - 3) for _ in range(4*n - 3)]

def star19(num, idx):
  if num == 1:
    arr[idx][idx] = '*'
    return;

  l = 4 * num - 3
  
  for i in range(idx, idx+l):
    arr[idx][i] = '*'
    arr[idx+l-1][i] = '*'

    arr[i][idx] = '*'
    arr[i][idx+l-1] = '*'

  return star19(num-1, idx+2)
star19(n,0)

for i in range(4*n-3):
  for j in range(4*n-3):
    print(arr[i][j], end='')
  print()

 

 

n = int(input())
arr = [[' '] * (4*n - 3) for _ in range(4*n - 3)]
# 행과 열이 (4*n - 3)인 2차원 배열을 만들어 준다.

def star19(num, idx):
  if num == 1:
    arr[idx][idx] = '*'
    return;
# input() 값이 1일 때 배열 정중앙에 '*'을 출력

  l = 4 * num - 3
  
  for i in range(idx, idx+l):
    # 배열 테두리 위치에 '*' 출력
    # 위아래
    arr[idx][i] = '*'
    arr[idx+l-1][i] = '*'

     # 양옆
    arr[i][idx] = '*'
    arr[i][idx+l-1] = '*'

  return star19(num-1, idx+2)
  # 바깥쪽 -> 안쪽
  # idx+2를 하는 이유는 위에서 설명했듯이 n값이 하나 줄어들수록 오른쪽으로, 밑으로 2칸 옮겨진 위치부터 '*'이 출력되기 때문
  
star19(n,0)

for i in range(4*n-3):
  for j in range(4*n-3):
    print(arr[i][j], end='')
  print()

 

 

 

Point

2차원 배열 쉽게 만들기
arr = [[' '] * n for _ in range(n)]]

재귀함수 로직 찾기 중요
댓글
최근에 올라온 글
«   2024/11   »
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
Total
Today
Yesterday