문제 링크
문제
홀수인 자연수 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이 주어졌을 때, 1부터 N까지의 자연수를 달팽이 모양으로 배치한 N x N 배열을 출력하고, N 이하의 자연수가 하나 주어지면 해당 숫자의 배열 내 좌표도 출력하는 문제이다.
문제 해결 접근 방법
시작 위치(중앙)에서 이동할 수 있는 방향을 상 → 우 → 하 → 좌 순으로 반복한다.
만약 그 방향으로 이동할 수 없으면 방향을 전환한다. (인덱스 범위를 벗어나거나, 진행 방향에 이미 숫자가 채워져 있는경우)
let n = Int(readLine()!)!
let target = Int(readLine()!)!
var snail = Array(repeating: Array(repeating: 0, count: n), count: n)
var x = n / 2, y = n / 2
var num = 1
var direction = 0
var step = 1
var coordinates = (0, 0)
snail[x][y] = num
if num == target { coordinates = (x + 1, y + 1) }
num += 1
while num <= n * n {
for _ in 0..<step {
switch direction {
case 0: x -= 1
case 1: y += 1
case 2: x += 1
case 3: y -= 1
default: break
}
snail[x][y] = num
if num == target { coordinates = (x + 1, y + 1) }
num += 1
if num > n * n { break }
}
direction = (direction + 1) % 4
if direction == 0 || direction == 2 { step += 1 }
}
snail.forEach { print($0.map { String($0) }.joined(separator: " ")) }
print(coordinates.0, coordinates.1)