중앙에서 시작해서 달팽이가 가는 그대로 따라가면서 숫자를 할당해주면 된다!
채점 중 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초인걸 보고서도 어쨌든 시간복잡도가 굉장할(?) 거라고 예상해서 다른 방법을 봤지만 딱히 뾰족한 수가 안 떠올랐다.. 구현 문제는 냅다 헤딩해도 될 것 같다.ㅋㅋ
'공부하자! > 알고리즘' 카테고리의 다른 글
LeetCode | 46. Permutations (Medium) - Swift (0) | 2023.07.14 |
---|---|
백준 21608 상어 초등학교 Swift - 구현 (0) | 2023.06.20 |
백준 20546 기적의 매매법 Swift - 구현 (0) | 2023.05.23 |
백준 20053 최소, 최대 2 Swift - 구현 (0) | 2023.05.13 |
프로그래머스 | 영어 끝말잇기 Lv.2 Swift (0) | 2023.03.17 |