백준 1913 달팽이 Swift - 구현

중앙에서 시작해서 달팽이가 가는 그대로 따라가면서 숫자를 할당해주면 된다!

채점 중 50%대 쯤에 틀렸다고 나왔는데, 찾고자 하는 자연수가 1일 때를 생각 안해서 틀렸다.

스스로 반례 찾는 연습도 해야할 듯!!

//
//  main.swift
//  CodingTestPractice
//
//  Created by CHOI on 2023/05/23.
//
// 달팽이

import Foundation

let n = Int(readLine()!)! // 홀수인 자연수 N
let target = Int(readLine()!)! // 찾고자 하는 N^2 이하의 자연수
var arr = Array(repeating: Array(repeating: 0, count: n), count: n)

func solution() -> String {
    var targetString = "" // 찾고자 하는 자연수 출력을 위한 변수
    var temp = 4 // 방향 전환을 위한 변수
    
    // 달팽이 시작 좌표 (x, y)
    var x = n / 2
    var y = n / 2
    arr[x][y] = 1
    if target == 1 { // 찾고자 하는 자연수가 1이면 미리 targetString에 저장
        targetString = "\\(x + 1) \\(y + 1)"
    }
    
    // 상하좌우 방향 좌표
    let dr = [0, 1, 0, -1]
    let dc = [1, 0, -1, 0]
    
    // 2부터 N^2까지 달팽이가 가는 길을 표시
    for i in 2...n*n {
        // 원하는 방향으로 한 칸 이동 후 해당 좌표에 숫자 할당
        x = x + dr[(temp - 1) % 4]
        y = y + dc[(temp - 1) % 4]
        arr[x][y] = i
        
        // 방향 돌리기
        if arr[x + dr[temp % 4]][y + dc[temp % 4]] == 0 {
            temp += 1
        }
        
        // 찾고자 하는 자연수가 나오면 targetString에 저장
        if i == target {
            targetString = "\\(x + 1) \\(y + 1)"
        }
    }
    
    // 결과 출력
    arr.forEach { line in
        let stringLine = line.map { String($0) }.joined(separator: " ")
        print(stringLine)
    }
    
    return targetString
}

print(solution())

 

시간 제한이 2초인걸 보고서도 어쨌든 시간복잡도가 굉장할(?) 거라고 예상해서 다른 방법을 봤지만 딱히 뾰족한 수가 안 떠올랐다.. 구현 문제는 냅다 헤딩해도 될 것 같다.ㅋㅋ