본문 바로가기

알고리즘/프로그래머스

프로그래머스 - 삼각 달팽이

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

 


 

enum 타입으로 위, 아래, 가로 이동을 두고 

만들어진 배열을 한칸식 채우면서 이동한 다음 flatMap을 이용해서 순서대로 출력해주면 된다

 

처음 while문에 조건을  모든 배열에서 0이 있는지 없는지 검사를 했는데 시간초과로 인해 풀리지 않았다.

while tri.flatMap({ $0 }).contains(0) {

}

 

최종 코드

 

start: 시작 층

end: 마지막 층

count: 배열에 넣을 값

max: while문이 n번 돌았는지 확인하는 변수

 

x, y: 배열에 데이터를 넣을때 행과 열 값을 저장하는 변수

func solution(_ n:Int) -> [Int] {
    var tri = [[Int]]()
    
    enum Type: String {
        case up, down, horizontal
    }
    
    var type: Type = .down
    
    for i in 1 ... n {
        let a = Array(repeating: 0, count: i)
        tri.append(a)
    }
    
    var start = 0
    var end = n - 1
    var count = 1
    var max = n
    
    var x = 0
    var y = 0
    
    while max > 0 {
        switch type {
        case .down:
            for i in start ... end {
                tri[i][x] = count
                count += 1
            }
            x += 1
            type = .horizontal
            max -= 1
        case .up:
            for i in (start ... end).reversed() {
                y -= 1
                tri[i][y] = count
                count += 1
            }
            
            max -= 1
            type = .down
            start += 1
        case .horizontal:
            while tri[end].contains(0) {
                y += 1
                tri[end][y] = count
                
                count += 1
            }
            
            type = .up
            start += 1
            end -= 1
            
            max -= 1
        }
    }
    
    return tri.flatMap { $0 }
}