boraBong

[Swift] 삼각 달팽이 문제 풀이 [Programmers - Level2] 본문

iOS/Algorithm

[Swift] 삼각 달팽이 문제 풀이 [Programmers - Level2]

보라봉_ 2023. 4. 5. 01:53
728x90

💬 문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


💬 Idea

삼각형을 채울 때 n에서부터 ↙️ ➡️ ↖️ 의 규칙을 따르며 숫자가 채워지고, 채워지는 기준 개수가 -1씩 줄어든다는 것을 발견하여
해당 원리를 이용해 문제를 풀이했다.
 
반복문을 돌며 trianglePoint 변수를 1씩 증가하면서, 3으로 나눈 나머지로 규칙을 갖게끔 설계하였다.
(삼각형이므로 3씩 기점으로 패턴이 반복됨)

  • 3으로 나눈 나머지가 1일 때 : 하강 (y--)
  • 3으로 나눈 나머지가 2일 때 : 오른쪽으로 이동 (x++)
  • 3으로 나눈 나머지가 0일 때 : 상승 (y++)

 
 
<예시 N = 5 일 때 >
[[0], [0,0], [0,0,0], [0,0,0,0], [0,0,0,0,0]] 배열이 [[1], [2,12], [3,13,11], [4,14,15,10], [5,6,7,8,9]] 와 같이 채워진다.

 
 

# 1️⃣단계 (↙️  밑으로 하강하며 채우기)

N = 5
밑으로 하강하면서 [0][0], [1][0], [2][0], [3][0], [4][0]이 채워진다.

 
 

# 2️⃣단계 (➡️  오른쪽으로 이동하며 채우기)

N = 4
오른쪽으로 이동하면서 [4][1], [4][2], [4][3], [4][4]가 채워진다.

 
 
N = 3
위로 상승하면서 [3][3], [2][2], [1][1]이 채워진다.

# 3️⃣단계 (↖️ 위로 상승하면서 채우기)

 
 

# 4️⃣단계 (↙️ 밑으로 하강하면서 채우기)

N = 2
밑으로 하강하면서 [2][1], [3][1]이 채워진다.

 
 

# 5️⃣단계 (➡️  오른쪽으로 이동하며 채우기)

N = 1
오른쪽으로 이동하면서 [3][2]가 채워진다.

 
 
 


💬 풀이

import Foundation

func solution(_ n:Int) -> [Int] {
    var n = n
    var trianglePoint = 1
    var triangleFilledCnt = 0 // 삼각형에 채워지는 숫자 개수
    var number = 0 // 계속 오르는 숫자
    var y = -1 // y 좌표
    var ansArr: [[Int]] = []
    
    for i in 1...n {
        ansArr.append(Array(repeating: 0, count: i))
    }
    
    while n > 0 {
        number += 1
        triangleFilledCnt += 1
        
        switch trianglePoint % 3 {
        case 0: // 상승하면서 채워짐
            y -= 1
            ansArr[y][ansArr[y].lastIndex(of: 0) ?? 0] = number
        case 1: // 하강하면서 채워짐
            y += 1
            ansArr[y][ansArr[y].firstIndex(of: 0) ?? 0] = number
        default: // 가장 밑단만 채워짐
            ansArr[y][ansArr[y].firstIndex(of: 0) ?? 0] = number
        }
         
        // 기점 예시: 5 / 4 / 3 / 2 / 1
        if triangleFilledCnt == n {
            n -= 1 // 기준 숫자 - 1
            trianglePoint += 1 // 삼각형 point + 1
            triangleFilledCnt = 0
        }
    }
    
    return ansArr.flatMap({ $0 })
}

 

 

https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%EC%82%BC%EA%B0%81%20%EB%8B%AC%ED%8C%BD%EC%9D%B4.swift

 

GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift

Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.

github.com

 

반응형
Comments