Swift) 프로그래머스 Lv.2 - 삼각달팽이
2021. 7. 28. 20:32ㆍ카테고리 없음
https://programmers.co.kr/learn/courses/30/lessons/68645
상당히 오래 고심했던 문제다.
처음 시도했던 풀이는 start = 0, end = N-1 변수를 만들어 한번 회전할 때마다 start에 +1, end - 2를 하는식으로 구현했는데 첫번째 회전에는 숫자가 잘 입력되지만 2번째 회전 이상부터는 start와 end만 가지고 적절한 배열에 숫자를 넣을 수 없어 한참을 고민했다.
결국 어거지로 풀어낸 것이 X인덱스와 Y인덱스를 만들어 방향이 바뀔 때마다 X와 Y인덱스의 값을 변경한다.
숫자가 추가될때마다 반복종료를 해야할지 생각해야 해서 그리 깔끔한 코드는 아니지만 그래도 직접풀어낸것에 의의를 둬야지
func solution(_ n:Int) -> [Int] {
var snail: [[Int]] = []
var total = 0
for i in 1...n {
total += i
let n = Array(repeating: 0, count: i)
snail.append(n)
}
snail[0][0] = 1
var startY = 0
var startX = 0
var n = n
var flag = false
guard n != 1 else {
return [1]
}
while true {
if snail[startY+1][startX] == 0 {
for _ in 1...n-1 {
if snail[startY+1][startX] != 0 {
break
}
startY += 1
snail[startY][startX] = snail[startY-1][startX] + 1
if snail[startY][startX] == total {
flag = true
break
}
}
if flag {
break
}
for _ in 1...n-1 {
if snail[startY][startX+1] != 0 {
break
}
startX += 1
snail[startY][startX] = snail[startY][startX-1] + 1
if snail[startY][startX] == total {
flag = true
break
}
}
if flag {
break
}
for _ in 1..<n-1 {
if snail[startY-1][startX-1] != 0 {
break
}
startX -= 1
startY -= 1
snail[startY][startX] = snail[startY+1][startX+1] + 1
if snail[startY][startX] == total {
flag = true
break
}
}
if flag {
break
}
}
n -= 2
}
var res:[Int] = []
for s in snail {
for v in s {
res.append(v)
}
}
return res
}