[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
'여니의 취준 준비 > 코딩테스트 (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 |