PS/문제 풀이

[프로그래머스/Swift] 68645번 - 삼각 달팽이

시르베어 2025. 3. 5. 13:22

🔗 문제 링크

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

💡 구현 아이디어

  1. 바깥쪽에서 안쪽으로 진행
  2. 모든 블록을 확인하면 종료
  3. 전체 사이클의 수는 (n-1)/3+1
  4. idx: 배열의 위치, num: 현재 숫자, c: 현재 사이클(바깥쪽에서 부터 몇번째 삼각형인지
  5. 왼쪽 아래로 내려갔다가 오른쪽 끝으로 갔다가 왼쪽 위로 올라가면서 한 사이클 마무리
  6. 사이클의 시작 인덱스는 이전 사이클 인덱스 + 현재사이클 수 * 4

💻 코드

import Foundation

func solution(_ n:Int) -> [Int] {
  var idx = 0
  var num = 1
  var arr = [Int](repeating: -1, count: (1...n).reduce(0, +))
  var preIdx = 0
  
  for c in 0..<(n-1)/3+1 {
    idx = preIdx+c*4
    preIdx = idx
    arr[idx] = num
    num += 1
    for z in 1..<(n-3*c) {
      idx += 2*c+z
      arr[idx] = num
      num += 1
    }
    for _ in 0..<n-(3*c)-1 {
      idx += 1
      arr[idx] = num
      num += 1
    }
    if (n-2)-3*c > 0 {
      for z in 0..<(n-2)-3*c {
        idx -= ((n-c)-z)
        arr[idx] = num
        num += 1
      }
    }
  }
  return arr
}

❌ 틀린 이유 및 틀린 부분

⏳ 시간 복잡도

각 칸을 한번씩 방문하기 때문에 O(n)

📌 풀이 또는 기억할 정보