여니의 취준 준비/코딩테스트 (Python)

[n10994] 별 찍기 - 19

여니's 2021. 5. 21. 16:48

 

 

[2022. 02. 23 다시 품]

num = int(input())
num -= 1
x, y = (4 * num + 1) // 2, (4 * num + 1) // 2
array = [[' ' for _ in range(4 * num + 1)] for _ in range(4 * num + 1)]
array[x][y] = "*"
idx = 0
for _ in range((num + 1) * 2 - 1):
    if idx == 0:
        idx += 1
        continue
    if idx % 2 == 0:
        for i in range(2*idx+1):
            array[x - idx][y - idx + i] = "*"  # 윗줄
            array[x - idx + i][y - idx] = "*"  # 왼쪽 세로줄
            array[x - idx + i][y + idx] = "*"  # 오른쪽 세로줄
            array[x + idx][y - idx + i] = "*"  # 아랫줄
    idx += 1
for i in range((4*num)+1):
    print(''.join(array[i]))

input_num = int(input())
map_size = input_num * 4 - 3
star_map = [[' '] * map_size for _ in range(map_size)]


def draw(input_num, idx):
    if input_num == 1:
        star_map[idx][idx] = '*'
        return

    l = 4 * input_num - 3
    for i in range(idx, l + idx):
        star_map[idx][i] = "*"
        star_map[idx + l - 1][i] = "*"

        star_map[i][idx] = "*"
        star_map[i][idx + l - 1] = "*"
    return draw(input_num - 1, idx + 2)

draw(input_num, 0)

for i in range(map_size):
    for j in range(map_size):
        print(star_map[i][j],end='')
    print()

 

재귀 함수를 이용해서 문제를 풀어야 한다.

input값이 3일 경우,

격자의 총 크기는 3*4-3 = 9

즉, 9 x 9의 크기로 그려야한다.

 

n = input_num이라고 가정한다.

 

n=3일땐, 맨 바깥쪽 상자를 그려야하고,

n=2일때로 넘어가서 또 상자를 그리게끔 해줘야하기에

draw(input_num-1, idx+2)로 재귀함수를 호출해줘야한다.

 

input_num-1은 당연히 해야하는 작업이라 생각해서 설명은 생략!

idx+2는 생각해볼 필요가 있음!

 

n=2일때의 상자가 n=3일때 그린 상자에서 행과 열을 2칸씩 이동한 위치에서 그려져야한다.

따라서 idx는 +2를 해주는 것이다!

 

그래서 n=2일때 함수 실행을 살펴보면,

for문에서 (idx,. idx+l)이라고 되어 잇는 부분을 살펴봐야 한다.

 

n=2일때, (2,2)~(6,6) 테두리에 별을 그리게끔 해야한다.

따라서 for문의 범위는 (2,2+5) => (2.7) | 2~6

 

n=3일때는? (0,0+9) => (0,9) | 0~8

n=1일땐? (4,4+1) => (4,5) | 4

 


재귀함수인 것도 알았고, 행과 열을 2씩 이동해줘야하는 것도 알았는데

for문 반복문을 저렇게 설정해줘야한다는 걸 몰라서 많이 헤맸다.

 

참고 블로그

https://namhandong.tistory.com/104

 

백준 10994번 파이썬 | 별 찍기 -19 | 재귀함수

문제 예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요. 입력 첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다. 출력 첫째 줄부터 차례대로 별을 출력한다. 풀이 n에 따라서 (4*n -3) 만큼의 칸수들이 생기며

namhandong.tistory.com

 

 

'여니의 취준 준비 > 코딩테스트 (Python)' 카테고리의 다른 글

[n20436] ZOAC 3 in python  (0) 2021.05.21
[n20291] 파일 정리  (0) 2021.05.21
[n1244] 스위치 켜고 끄기  (0) 2021.05.21
[Python] n4396 | 지뢰찾기  (0) 2021.05.05
[Python] n2578번 | 빙고  (0) 2021.05.03