프로그래밍/코딩테스트

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

turu 2021. 6. 5. 13:22

[문제 보기]

더보기

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.

 


제한사항

  • n은 1 이상 1,000 이하입니다.

입출력 예

n, result
4 [1,2,9,3,10,8,4,5,6,7]
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]

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • 문제 예시와 같습니다.

 

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

 

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

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

 


예전에 풀었던 달팽이 문제는 사각형이었는데 이번에는 삼각형인 문제였다.

 

import Foundation

func solution(_ n:Int) -> [Int] {
    var mat = [[Int]](repeating: [Int](repeating: 0, count: n), count: n)
    
    var count = 0
    var pos = (0, 0)
    var number = 1
    while count < n {
        switch count % 3 {
            case 0: // 아래
                for i in 0..<(n - count) {
                    mat[pos.0 + i][pos.1] = number
                    number += 1
                }
                pos = (pos.0 + n - count - 1, pos.1 + 1)
            case 1: // 오른쪽
                for i in 0..<(n - count) {
                    mat[pos.0][pos.1 + i] = number
                    number += 1
                }
                pos = (pos.0 - 1, pos.1 + n - count - 1 - 1)
            case 2: // 대각선
                for i in 0..<(n - count) {
                    mat[pos.0 - i][pos.1 - i] = number
                    number += 1
                }
                pos = (pos.0 - (n - count - 1) + 1, pos.1 - (n - count - 1))
            default: break
        }
        
        count += 1
    }
    
    var result = [[Int]](repeating: [], count: n)
    for i in 0..<mat.count {
        result[i] = Array(mat[i][0...i])
    }
        
    return result.flatMap { $0 }
}

 


생각 정리

다른 풀이를 찾아보니 dx, dy 배열을 이용하여 간단하게 푼 방법이 있었다.

 

def solution(n):
    dx=[0,1,-1];dy=[1,0,-1]
    b=[[0]*i for i in range(1,n+1)]
    x,y=0,0;num=1;d=0

    while num<=(n+1)*n//2:
        b[y][x]=num
        ny=y+dy[d]
        nx=x+dx[d]
        num+=1
        if 0<=ny<n and 0<=nx<=ny and b[ny][nx]==0:
            y, x = ny, nx
        else:
            d=(d+1)%3
            y+=dy[d]
            x+=dx[d]
    return sum(b,[])
반응형