코딩테스트

[Swift 알고리즘] 프로그래머스(Lv.2) - 삼각 달팽이

유정주 2022. 5. 3. 10:32
반응형

안녕하세요. 개발 중인 정주입니다.

 

오늘은 "프로그래머스(Lv.2) - 삼각 달팽이" 문제를 풀었습니다.

 


Github

 

GitHub - jeongju9216/SwiftAlgorithm: 스위프트 알고리즘

스위프트 알고리즘. Contribute to jeongju9216/SwiftAlgorithm development by creating an account on GitHub.

github.com

 

문제 링크

 

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

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. 구역 나누기

숫자를 채우는 구역을 나눠야 합니다.

저는 아래 방향, 오른쪽 방향, 위쪽 방향으로 나눴습니다.

이때 편의를 위해 n-1까지 쭉 채우는 것이 아니라 한 칸 남기고 채웠습니다.

또한, 1 사이클을 돌 때마다 안쪽으로 한 칸 들어가야 합니다. (time 변수)

 

2. 아래 방향으로 채우기

아래로 이동하는 것은 쉽습니다.

x index를 time으로 고정시키고 y index를 증가 시킵니다.

위에서 말했듯이 오른쪽 방향으로 채우는 것의 시작점을 위해 한 칸을 덜 채워줍니다.

예를 들어, n=6인 1 사이클은 1~5까지만 채우는 것입니다.

 

3. 오른쪽 방향으로 채우기

위에서 한 칸을 덜 채웠기 때문에 오른쪽 방향으로 채우는 시작점 설정이 간편합니다.

위 범위와 동일하게 한 칸 남기고 빈 칸을 채워줍니다.

n=6인 1 사이클에서는 6 ~ 10까지 채우는 것입니다.

 

4. 윗 방향으로 채우기

윗 방향으로 채우는 것은 마지막 - time에 위치에 수를 넣으면 됩니다.

n=6인 1 사이클에서는 11 ~ 15까지 채우는 것입니다.

 

1~n의 합이 채워질 때까지 위 과정으로 반복합니다.

 

별거 아닌 문제 같았는데 참 골치였네요.

감사합니다!


전체 코드

import Foundation

func solution(_ n:Int) -> [Int] {    
    if n == 1 {
        return [1]
    } else if n == 2 {
        return [1, 2, 3]
    } 
    
    var array: [[Int]] = Array(repeating: [], count: n)
    for i in 0..<n {
        array[i] = Array(repeating: 0, count: i+1)
    }
    
    let finishNum = (1...n).reduce(0, +)
    // print("finishNum: \(finishNum)")
 
    var count = 1
    var time = 0
    while count <= finishNum {
        for i in time..<(n-1-time) { //아래로 이동. n=6일 때, 1~5까지 이동
            guard array[i][time] == 0 else { continue }
            array[i][time] = count
            count += 1
        }
        
        if count > finishNum { break }

        for i in time..<(n-1-time) { //오른쪽으로 이동. n=6일 때, 6~10까지 이동
            let index = n - 1 - time
            guard array[index][i] == 0 else { continue }
            array[index][i] = count
            count += 1
        }
        
        if count > finishNum { break }

        for i in time..<(n-1-time) { //위로 이동. n=6일 때, 11~15까지 이동
            let index = n - 1 - i
            guard array[index][index-time] == 0 else { continue }
            array[index][index-time] = count
            count += 1
        }    
        
        time += 1
    }
    
    var result: [Int] = []
    for i in array {
        result.append(contentsOf: i)
    }
    
    return result
}

아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형