Swift) 프로그래머스 Lv.2 - 삼각달팽이

2021. 7. 28. 20:32카테고리 없음

https://programmers.co.kr/learn/courses/30/lessons/68645

 

코딩테스트 연습 - 삼각 달팽이

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

 

 

 

상당히 오래 고심했던 문제다.

 

처음 시도했던 풀이는 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
}