알고리즘 문제 풀이

[Swift] 프로그래머스 LV2. 삼각 달팽이

lgvv 2022. 4. 1. 23:49

프로그래머스 LV2. 삼각 달팽이

 

✅ 프로그래머스 LV2. 삼각 달팽이

아주 오래걸린 문제였다.

여러가지 방법이 있었는데, 처음에는 배열을 [ [], [], [], [] ] 이런 식으로 세팅해 두어서 insert와 append로 알고리즘을 작성하니까 너무나도 어려웠다.

근데 그냥 n = 3이라고 가정하면, [ [0,0,0], [0,0,0], [0,0,0] ] 이렇게 세팅하고 푸니까 우선 훨씬 쉬워질 수 있었다.

왜냐하면 index를 [row][col]로 접근할 수 있어서!! 

 

문법적으로는 2가지를 보면 된다.

1. 2차원 배열을 크기를 주어서 만드는 방법과

2. flatMap을 사용한 부분

 

🟠 알고리즘을 떠올리는 과정 

이걸 곰곰이 생각해보니까, 

[ 1 ]

[ 2, 9 ]

[ 3 ,10 ,8 ]

[ 4, 5, 6, 7 ]

이렇게 생겼는데, 패턴을 찾을 수 있었다.

 

🟠 내가 발견한 패턴

위에서 아래로 이동한다. -> row만 변경한다.

왼쪽에서 오른쪽으로 이동한다. -> col만 변경한다.

(왼 + 위)로 이동한다. -> row, col 둘다 변경한다.

 

이렇게 놓고 보니 풀 자신감이 생김. enum으로 pattern에 대한 정의를 만들어서 사용하려고 했으나, 그렇지 않아도 풀릴거 같길래 그냥 품.

 

 

✅ 코드와 알고리즘 설명

코드를 하나하나 따라가면서 그림을 그려보자. 그럼 쉽게 파악할 수 있다.

 func solution(_ n:Int) -> [Int] {
        var matrix: [[Int]] = [[Int]](repeating: Array(repeating: 0,count: n), count: n)
                                      
        let sum = n * (n+1) / 2 // 등차수열의 합
        var row = -1
        var col = 0
        var i = n
        var j = 0
        var currentNumber = 0
        
        while i > 0 {
            
            j = 0
            while (j < i) {
                row += 1
                currentNumber += 1
                matrix[row][col] = currentNumber
                j += 1
            }
            
            j = 0
            while (j < i-1) {
                col += 1
                currentNumber += 1
                matrix[row][col] = currentNumber
                j += 1
            }
            
            j = 0
            while (j < i-2) {
                col -= 1
                row -= 1
                currentNumber += 1
                matrix[row][col] = currentNumber
                j += 1
            }
            
            i -= 3
        }
        
        return matrix.flatMap { $0.filter{ $0 != 0 } }
    }

알고리즘 생각할 때 그린 이미지