
중앙에서 시작해서 달팽이가 가는 그대로 따라가면서 숫자를 할당해주면 된다!
채점 중 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 |