반응형

[Silver III] 달팽이 - 1913

문제 링크

성능 요약

메모리: 70272 KB, 시간: 920 ms

분류

구현(implementation)

문제 설명

홀수인 자연수 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번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.

n = int(input())
m = int(input())
graph = [[0 for _ in range(n)] for _ in range(n)]

dx = [0,1,0,-1]
dy = [1,0,-1,0]
x, y = n//2, n//2
num = 1
le = 0
coordinate = [x+1,y+1]
graph[x][y] = num

while True:
  for i in range(4):
      for _ in range(le):
        x += dx[i]
        y += dy[i]
        num += 1
        graph[x][y] = num
        if num == m:
          coordinate = [x+1, y+1]
  if x == y == 0:
    break
  x -= 1
  y -= 1
  le += 2
for i in range(n):
  print(*graph[i])
print(*coordinate)

1.규칙성을 찾아준다. => 위 , 오른쪽, 아래, 왼쪽 순.

2.그러나, 규칙을 반복할 때마다 좌표 x,y축을 -1씩 하여 대각선 뒤 부터 시작하면 규칙을 수월하게 반복할 수 있다. (le+=2)

3.그렇게 되면 규칙성은 => 오른쪽, 아래, 왼쪽, 위 순.

4.좌표가 0,0에 도착할 때까지 반복해주고 출력. 만약 1의 좌표를 구해야할 경우 coordinate를 미리 구해놨던 [x+1,y+1]출력

+ Recent posts