상세 컨텐츠

본문 제목

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

Algorithm

by 쑤야. 2024. 3. 4. 15:45

본문

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

 

프로그래머스

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

programmers.co.kr

 

접근


규칙을 찾아서 구현하는 문제

  • 왼쪽 → 아래 → 오른쪽 순서로 방향 진행
  • 왼쪽은 row +1, col 유지
  • 아래쪽은 row 유지, col +1
  • 오른쪽은 row와 col 모두 -1씩

2차원 배열을 생성해서 각 row의 데이터 크기를 미리 초기화한다. 

 

값을 반환할 때 flatMap을 활용하여 2차원 배열을 1차원 배열로 변환한다. 

 

코드


import Foundation

func solution(_ n:Int) -> [Int] {
    
    var result = [[Int]]()
    for i in 1...n {
        result.append([Int](repeating: 0, count: i))
    }
    
    var num = 1
    let size = (1...n).reduce(0){ $0 + $1 }
    
    var row = (0, n-1)
    var col = 0
    
    while num <= size {
        //왼쪽
        //row +1씩, col 고정
        for i in stride(from: row.0, to: row.1+1, by: +1) {
            if num > size {
                break
            }
            result[i][col] = num
            num += 1
        }
        
        //아래쪽
        //col +1씩, row 고정
        for i in stride(from: col+1, to: result[row.1].count-col, by: +1){
            if num > size {
                break
            }
            result[row.1][i] = num
            num += 1
        }
        
        //오른쪽
        //row -1씩, col -1씩
        for i in stride(from: row.1-1, to: row.0, by: -1){
            if num > size {
                break
            }
            let targetC = result[i].count-1 - col
            result[i][targetC] = num
            num += 1
        }
        
        row.0 += 2
        row.1 -= 1
        col += 1
    }
    
    return result.flatMap{ $0 }
}

관련글 더보기