Algorithm Problem Solving/Programmers

[프로그래머스] 월간 코드 챌린지 시즌1 삼각 달팽이 with Swift

코코자장자장 2022. 1. 29. 03:43

안녕하세요. 오늘은 프로그래머스 삼각 달팽이 문제를 풀어보겠습니다.

 

 

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

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

 

삼각 달팽이 문제는 완전 생 구현으로 문제를 해결하였습니다.

 

따로 알고리즘을 적용하여 문제를 푸는 방법은 생각해보지 않았습니다.

 

우선 삼각 달팽이를 그려줄 2중 배열을 만들어줍니다.

var snailArray:[[Int]] = [[Int]](repeating: [Int](repeating: 0, count: n), count: n)

 

여기에 데이터를 넣고 0 이 아닌 경우만 answer배열에 다시 집어 넣어서 문제를 풀겁니다!

 

삼각 달팽이는 n-1의 수 만큼 꺽입니다.

 

그러므로 n개의 직선을 그려주면 됩니다.

n개의 직선의 방향을 미리 정해봅시다.

let direction:[[Int]] = [
    [ 0, 1],
    [ 1, 0],
    [-1,-1]
]

 

이제 실제로 그려주는 부분입니다. 벽에 부딫히면 방향을 다음방향으로 바꿔줍시다!

for _ in 0..<n {
    while true{
        let nextX = currentX + direction[currentDirection][0]
        let nextY = currentY + direction[currentDirection][1]
        if nextX >= n || nextY >= n || nextX < 0 || nextY < 0 {
            currentDirection = (currentDirection + 1) % 3
            break
        }
        if snailArray[nextY][nextX] != 0 {
            currentDirection = (currentDirection + 1) % 3
            break
        }
        currentData += 1
        currentX = nextX
        currentY = nextY
        snailArray[currentY][currentX] = currentData
    }
}

 

마지막으로 answer배열에 정답을 순서대로 집어넣어주면 문제가 해결됩니다.

for i in snailArray {
    for j in i {
        if j != 0 {
            answer.append(j)
        }
    }
}

 

전체 코드를 보여드리겠습니다.

import Foundation

let direction:[[Int]] = [
    [ 0, 1],
    [ 1, 0],
    [-1,-1]
]

func solution(_ n:Int) -> [Int] {
    var snailArray:[[Int]] = [[Int]](repeating: [Int](repeating: 0, count: n), count: n)
    var answer:[Int] = [Int]()
    
    var currentX = 0
    var currentY = 0
    var currentDirection = 0
    var currentData = 1
    snailArray[0][0] = currentData
    
    for _ in 0..<n {
        while true{
            let nextX = currentX + direction[currentDirection][0]
            let nextY = currentY + direction[currentDirection][1]
            
            if nextX >= n || nextY >= n || nextX < 0 || nextY < 0 {
                currentDirection = (currentDirection + 1) % 3
                break
            }
            if snailArray[nextY][nextX] != 0 {
                currentDirection = (currentDirection + 1) % 3
                break
            }
            
            currentData += 1
            currentX = nextX
            currentY = nextY
            snailArray[currentY][currentX] = currentData
        }
    }
    
    for i in snailArray {
        for j in i {
            if j != 0 {
                answer.append(j)
            }
        }
    }
    
    return answer
}

오늘은 여기까지이며, 질문이 있으면 댓글로 남겨주세요!😊

 

오늘도 좋은 하루 되세요!