[프로그래머스] 삼각 달팽이
👨🏻‍💻iOS 공부/Swift_알고리즘 풀이

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

728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/68645?language=swift 

 

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

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],[2,9],[3,10,8],[4,5,6,7]]

 

이에 우선은 방향이 세 가지 있다는 것을 알 수 있다. 

 

1. 상단에서 좌측 하단으로

2. 좌측에서 우측으로

3. 우측하단에서 상단으로 

 

이렇게 방향을 반복하게 된다. 

 

방향은 아래와 같이 세팅해두고 인덱스로 접근하여 사용하면 된다. 

 

// dx[0]dy[0] = 좌측 상단에서에서 좌측 하단으로 
// dx[1]dy[1] = 좌측에서에서 우측으로 
// dx[2]dy[2] = 우측 하단에서 좌측 상단으로

let dx = [1,0,-1]
let dy = [0,1,-1]

자 이제 방향에 맞게 숫자를 채워나가는 흐름을 그려보자. 

 

1. 방향설정, 현재 행/열/숫자 초기화
2. 빈 배열 생성
3. 각 삼각형의 끝부분은 별도로 처리해준다. (아래 설명 참고)
4. 각 배열을 flat하게 펼쳐준다. 

 

3번 끝부분 처리

보면 노란색(3) + 빨강(1)이 첫번째 방향을 채우고, 그 다음 초록색(2) + 빨강(1)이 두 번째 방향을 채우고, 다음으로 보라색(1) + 빨강(1)이 세 번째 방향을 채우고 마지막으로는 빨강(1)로 차는 것을 볼 수 있다. 

 

빨간색의 경우 전체 for문을 돌면서 처리해줄 예정이고, 이외의 색깔들은 n에 따라서 1씩 줄면서 숫자를 채워주게 된다. 

 

import Foundation

func solution(_ n:Int) -> [Int] {
    // 방향 
    // dx[0]dy[0] = 좌측 상단에서에서 좌측 하단으로 
    // dx[1]dy[1] = 좌측에서에서 우측으로 
    // dx[2]dy[2] = 우측 하단에서 좌측 상단으로
    let dx = [1,0,-1]
    let dy = [0,1,-1]
    // 초기값 세팅
    var row = 0, col = 0, dir = 0, num = 1
    
    // 비어있는 피라미드 만들기
    var arr = (1...n).map { Array(repeating: 0, count: $0) }

    // n = 4일 경우 3개 1개 > 2개 1개 > 1개 1개 > 1개 채움
    for i in stride(from: n, to: 0, by: -1) {
        // 빨간색이 아닌 블록 채우는 역할
        for _ in 0..<i-1 {
            arr[row][col] = num
            row += dx[dir]
            col += dy[dir]
            num += 1
        }
        // 빨간색 부분 채워주는 역할
        arr[row][col] = num
        num += 1
        // 다음 방향으로 전환 + 이동
        dir = (dir + 1) % 3
        row += dx[dir]
        col += dy[dir]
    }

    return arr.flatMap {$0}
}

소용돌이 모양처럼 바깥에서 안쪽으로 돌면서 채워지는 배열을 구해보았다. 

 

일련의 규칙을 찾는게 까다로웠던 문제! 

비슷한 문제들로 Spiral Matrix 같은 유형이 있을 것 같다. 

728x90
반응형