🐌 달팽이
규칙을 찾아 푸는 구현 문제
✏️ 문제
홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.
9 | 2 | 3 |
8 | 1 | 4 |
7 | 6 | 5 |
25 | 10 | 11 | 12 | 13 |
24 | 9 | 2 | 3 | 14 |
23 | 8 | 1 | 4 | 15 |
22 | 7 | 6 | 5 | 16 |
21 | 20 | 19 | 18 | 17 |
N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.
입력
첫째 줄에 홀수인 자연수 N(3 ≤ N ≤ 999)이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.
출력
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.
💡 해결방법
실제로 상 하 좌 우 이동하는 코드를 짜서 풀어도 되지만! 그냥 규칙이 보이길래 규칙을 따라 풀어보았다.
우선 1은 배열의 n/2, n/2 위치에 저장한다.
내가 발견한 규칙은 다음과 같다.
첫번째 홀수번 이동
1 -> 2 이동할 때 위로 1번 이동한다.
2 -> 3 이동할 때 오른쪽으로 1번 이동한다.
두번째 짝수번 이동
3 -> 4 -> 5 이동할 때 아래로 2번 이동한다.
5 -> 6 -> 7 이동할 때 왼쪽으로 2번 이동한다.
세번째 홀수번 이동
7 -> 8 -> 9 -> 10 이동할 때 위로 3번 이동한다.
10 -> 11 -> 12 -> 13 이동할 때 오른쪽으로 3번 이동한다.
네번째 짝수번 이동
13 -> 14 -> 15 -> 16 -> 17 이동할 때 아래로 4번 이동한다.
17 -> 18 -> 19 -> 20 -> 21 이동할 때 왼쪽으로 4번 이동한다.
...
즉 규칙을 요약하면
홀수(n)번 이동 : 위로 n번, 오른쪽으로 n번
짝수(n+1)번 이동 : 아래로 n+1번, 왼쪽으로 n+1번
n이 증가하면서 계속해서 반복된다.
👩🏻💻 소스코드
# 1913 : 달팽이
import sys
n = int(sys.stdin.readline())
find = int(sys.stdin.readline())
d = [[0]*n for _ in range(n)]
d[n//2][n//2] = 1
r, c = n//2, n//2
for i in range(1, n):
# 홀수번 이동할 때. 위->오른쪽 이동
if i % 2 == 1:
# 위로 이동
for j in range(i):
d[r-1][c] = d[r][c]+1
r = r-1
# 오른쪽으로 이동
for j in range(i):
d[r][c+1] = d[r][c]+1
c = c+1
# 짝수번 이동할 때. 아래->왼쪽 이동
elif i % 2 == 0:
# 아래로 이동
for j in range(i):
d[r+1][c] = d[r][c]+1
r = r+1
# 왼쪽으로 이동
for j in range(i):
d[r][c-1] = d[r][c]+1
c = c-1
# 마지막 위로 이동
for _ in range(n-1):
d[r-1][c] = d[r][c]+1
r = r-1
x, y = 0, 0
for i in range(n):
for j in range(n):
print(d[i][j], end=' ')
if d[i][j] == find:
x, y = i+1, j+1
print()
print(x, y)
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서
www.acmicpc.net
'알고리즘 > 백준' 카테고리의 다른 글
백준 | 1780 - 종이의 개수 (python) (0) | 2021.12.09 |
---|---|
백준 | 2630 - 색종이 만들기 (0) | 2021.12.09 |
백준 | 1074 - Z (python) (0) | 2021.12.06 |
백준 | 1707 - 이분 그래프 (python) (0) | 2021.12.04 |
백준 | 2206 - 벽 부수고 이동하기 (python) (0) | 2021.12.03 |