안녕하세요. 개발 중인 정주입니다.
오늘은 "프로그래머스(Lv.2) - 삼각 달팽이" 문제를 풀었습니다.
Github
GitHub - jeongju9216/SwiftAlgorithm: 스위프트 알고리즘
스위프트 알고리즘. Contribute to jeongju9216/SwiftAlgorithm development by creating an account on GitHub.
github.com
문제 링크
코딩테스트 연습 - 삼각 달팽이
5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]
programmers.co.kr
풀이
이번 문제는 구현 문제입니다.
정~말 풀면서 화가 났네요 ㅎㅎㅎ
1. 구역 나누기
숫자를 채우는 구역을 나눠야 합니다.
저는 아래 방향, 오른쪽 방향, 위쪽 방향으로 나눴습니다.
이때 편의를 위해 n-1까지 쭉 채우는 것이 아니라 한 칸 남기고 채웠습니다.
또한, 1 사이클을 돌 때마다 안쪽으로 한 칸 들어가야 합니다. (time 변수)
2. 아래 방향으로 채우기
아래로 이동하는 것은 쉽습니다.
x index를 time으로 고정시키고 y index를 증가 시킵니다.
위에서 말했듯이 오른쪽 방향으로 채우는 것의 시작점을 위해 한 칸을 덜 채워줍니다.
예를 들어, n=6인 1 사이클은 1~5까지만 채우는 것입니다.
3. 오른쪽 방향으로 채우기
위에서 한 칸을 덜 채웠기 때문에 오른쪽 방향으로 채우는 시작점 설정이 간편합니다.
위 범위와 동일하게 한 칸 남기고 빈 칸을 채워줍니다.
n=6인 1 사이클에서는 6 ~ 10까지 채우는 것입니다.
4. 윗 방향으로 채우기
윗 방향으로 채우는 것은 마지막 - time에 위치에 수를 넣으면 됩니다.
n=6인 1 사이클에서는 11 ~ 15까지 채우는 것입니다.
1~n의 합이 채워질 때까지 위 과정으로 반복합니다.
별거 아닌 문제 같았는데 참 골치였네요.
감사합니다!
전체 코드
import Foundation
func solution(_ n:Int) -> [Int] {
if n == 1 {
return [1]
} else if n == 2 {
return [1, 2, 3]
}
var array: [[Int]] = Array(repeating: [], count: n)
for i in 0..<n {
array[i] = Array(repeating: 0, count: i+1)
}
let finishNum = (1...n).reduce(0, +)
// print("finishNum: \(finishNum)")
var count = 1
var time = 0
while count <= finishNum {
for i in time..<(n-1-time) { //아래로 이동. n=6일 때, 1~5까지 이동
guard array[i][time] == 0 else { continue }
array[i][time] = count
count += 1
}
if count > finishNum { break }
for i in time..<(n-1-time) { //오른쪽으로 이동. n=6일 때, 6~10까지 이동
let index = n - 1 - time
guard array[index][i] == 0 else { continue }
array[index][i] = count
count += 1
}
if count > finishNum { break }
for i in time..<(n-1-time) { //위로 이동. n=6일 때, 11~15까지 이동
let index = n - 1 - i
guard array[index][index-time] == 0 else { continue }
array[index][index-time] = count
count += 1
}
time += 1
}
var result: [Int] = []
for i in array {
result.append(contentsOf: i)
}
return result
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.