# 해당 포스팅은 이제 막 알고리즘 공부를 시작한 초보 수준에서 작성했음을 이해해주시고, 비난보다는 따뜻한 조언을 부탁드립니다.
안녕하십니까, 간토끼입니다.
오늘은 백준 10994번 (별 찍기-19)에 대해 다뤄보겠습니다.
1. 문제 링크
https://www.acmicpc.net/problem/10994
별 찍기 문제입니다.
입력으로 N이 주어지면 이를 바탕으로 규칙에 의거하여 별의 개수를 출력하면 되는데요.
규칙은 N의 개수에 따라 출력하는 양이 달라지는데, 별이 출력되는 array를 2차원 배열이라고 하면 각 행과 열의 개수는 (4*N)-3개입니다.
즉, N=2면 5x5 사이즈의 array가 만들어지고, N=3이면 9x9 사이즈의 array가 만들어지는 셈이죠.
그리고 N일 때 출력되는 결과를 보면, N-1에서 만들어지는 배열이 재귀적으로 반복됨을 알 수 있습니다.
즉 재귀함수를 이용하면 쉽게 구현할 수 있습니다.
2. 접근 방법
다음과 같이 접근하였습니다.
먼저 재귀적으로 반복됨을 파악해야하는데요.
보시면 (1), (2), (3), (4)번의 선분의 패턴이 반복되고 있음을 알 수 있습니다.
그리고 중간에 대각선을 따라가면 N이 1씩 줄어들면서 패턴이 가운데로 반복되면서 몰리고 있음을 캐치하시면 푸는 데 큰 무리는 없습니다.
함수를 보시면 반복문을 이용해 1,2,3,4번에 해당되는 배열의 위치에 "*" 값을 대입해줍니다.
그리고 반복문이 종료되면 N, 그리고 새로운 좌표(new_x, new_y)를 최신화해줍니다.
대각선을 따라간다는 것은 최초 위치에서 x+2, y+2 로 좌표를 최신화한다는 의미임을 쉽게 아실 수 있을 겁니다.
3. 코드
# 백준 : 별찍기 10994
star = int(input()) # 별 개수
length = (4*star)-3
map_array = [[' ']*(length) for _ in range(length)]
def star_19(n, x, y):
# 재귀적으로 별 찍기
global map_array
length = (4*n)-3
if length == 1:
map_array[x][y] = "*"
return
else:
for i in range(length):
map_array[x][y+i] = "*" # 윗변(1번 선분)
map_array[y+i][x] = "*" # 좌측변(2번 선분)
map_array[x+(length-1)][y+i] = "*" #아랫변(3번 선분)
map_array[x+i][y+(length-1)] = "*" #우측변(4번 선분)
n = n-1
x = x+2
y = y+2
star_19(n, x, y)
return
star_19(star, 0, 0)
for i in range(length):
print(*map_array[i], sep = '')
감사합니다.
잘 읽으셨다면 게시글 하단에 ♡(좋아요) 눌러주시면 감사하겠습니다 :)
(구독이면 더욱 좋습니다 ^_^)
* 본 블로그는 학부생이 운영하는 블로그입니다.
따라서 포스팅에 학문적 오류가 있을 수 있으며, 이를 감안해서 봐주시면 감사하겠습니다.
- 간토끼(DataLabbit)
- B.A. in Economics, Data Science at University of Seoul
'Python Programming > [BOJ ] Algorithm' 카테고리의 다른 글
[백준 BOJ] 2941번(크로아티아 알파벳) Python 풀이 (0) | 2023.08.11 |
---|---|
[백준 BOJ] 2563번(색종이) Python 풀이 (4) | 2023.08.10 |
[백준 BOJ] 1260번(DFS와 BFS) Python 풀이 (0) | 2023.08.09 |
[백준 BOJ] 25206번(너의 평점은) Python 풀이 (0) | 2023.08.07 |
[백준 BOJ] 4949번(균형잡힌 세상) Python 풀이 (0) | 2023.08.06 |