반응형

안녕하세요. 개발 중인 정주입니다.

 

오늘은 "프로그래머스(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
}

아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형
유정주