반응형
[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]출력
'알고리즘' 카테고리의 다른 글
[Silver II] 세 번째 - 5619 (구현) (1) | 2022.09.12 |
---|---|
[Silver III] 숫자 야구 - 2503(구현, 순열) (1) | 2022.09.11 |
[Silver IV] 수들의 합 2 - 2003 (두 포인터) (2) | 2022.09.09 |
[Silver III] 사탕 게임 - 3085 (구현, 브루트포스) (1) | 2022.09.09 |
[Silver V] 올림픽 - 8979 (구현, 정렬) (1) | 2022.09.08 |