알고리즘/백준

백준 | 1913 - 달팽이 (python)

유하 yuha 2021. 12. 9. 21:17

🐌 달팽이

규칙을 찾아 푸는 구현 문제

 

 


✏️ 문제

홀수인 자연수 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