[백준] 달팽이

Implementation
avatar
2025.03.28
·
4 min read

문제 링크

문제

홀수인 자연수 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부터 N2^2까지의 자연수를 달팽이 모양으로 배치한 N x N 배열을 출력하고, N2^2 이하의 자연수가 하나 주어지면 해당 숫자의 배열 내 좌표도 출력하는 문제이다.

문제 해결 접근 방법

  1. 시작 위치(중앙)에서 이동할 수 있는 방향을 상 → 우 → 하 → 좌 순으로 반복한다.

  2. 만약 그 방향으로 이동할 수 없으면 방향을 전환한다. (인덱스 범위를 벗어나거나, 진행 방향에 이미 숫자가 채워져 있는경우)

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)






- 컬렉션 아티클