[알고리즘] Swift -프로그래머스 연습문제 #181832(정수를 나선형으로 배치하기)

2023. 5. 30. 22:49ALGORITHM/Swift

728x90
반응형

 

문제링크

 

 

 

 

분석

양의 정수 n이 주어질 때

n * n배열에서 1부터 n의 제곱까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원배열을 리턴하는 문제이다.

 

풀이 과정

n=4일때, 4 * 4 = 16

1부터 16까지의 수를 나선형으로 입력한 표이다.

출력값이  [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]] 이다.

 

0으로 채운 n * n 배열을 만든다.

규칙을 보면 오른쪽으로 끝까지 가고 아래쪽 -> 왼쪽 -> 위쪽으로 반복한 다음

위쪽으로 갈 수가 없을 경우에 다시 오른쪽으로 이동한다.

이 규칙을 사용하여 x의 좌표와 y의 좌표를 가지고 배열에 수를 채운다.

// 오른쪽
if direction == 0 {
    if x == n - 1 || answer[y][x + 1] != 0 {
        direction = 1
        y += 1
    } else {
        x += 1
    }
}

 

 

 

 

가장 오른쪽을 갔을 경우에는 아래로 이동하고 그게 아니라면 계속해서 오른쪽으로 이동해준다.

x좌표가 n의 크기만큼 갔다면 가장 오른쪽까지 간 것이다. 여기서  n-1은 n이 1부터 시작하기 때문이다.

answer[y][x+1] != 0의 뜻은 다음 오른쪽 칸의 값이 0이 아니라면이라는 뜻인데, answer의 배열은 초기값이 0이기 때문에 0이 아니라면 다른 값이 들어갔다는 뜻이므로 오른쪽이이 아닌 아래쪽으로 이동해야 한다.

이제 오른쪽 아래쪽 왼쪽 위쪽까지 반복하면 된다.

 

풀이

import Foundation

func solution(_ n: Int) -> [[Int]] {
    var answer = Array(repeating: Array(repeating: 0, count: n), count: n)
    var y = 0
    var x = 0
    var direction = 0

    for i in 1...n * n {
        answer[y][x] = i

        // 오른쪽
        if direction == 0 { 
            if x == n - 1 || answer[y][x + 1] != 0 {
                direction = 1
                y += 1
            } else {
                x += 1
            }
            
        // 아래
        } else if direction == 1 { 
            if y == n - 1 || answer[y + 1][x] != 0 {
                direction = 2
                x -= 1
            } else {
                y += 1
            }
            
        // 왼쪽
        } else if direction == 2 { 
            if x == 0 || answer[y][x - 1] != 0 {
                direction = 3
                y -= 1
            } else {
                x -= 1
            }
            
        // 위
        } else if direction == 3 { 
            if y == 0 || answer[y - 1][x] != 0 {
                direction = 0
                x += 1
            } else {
                y -= 1
            }
        }
    }

    return answer
}

 

결과

print(solution(4))

 

 


📂  정리

다른 사람의 풀이

import Foundation

func solution(_ n:Int) -> [[Int]] {
    var answer = Array(repeating: Array(repeating: 0, count: n), count: n)
    let dx = [0, 1, 0, -1]
    let dy = [1, 0, -1, 0]
    var x = 0, y = 0, direction = 0
    
    for i in 1...n * n {
        answer[x][y] = i
        let nx = x + dx[direction]
        let ny = y + dy[direction]
        
        if nx < 0 || ny < 0 || nx >= n || ny >= n || answer[nx][ny] != 0 {
            direction = (direction + 1) % 4
            x += dx[direction]
            y += dy[direction]
        } else {
            x = nx
            y = ny
        }
    }
    return answer
}

오른쪽 아래쪽 왼쪽 위쪽의 방향설정을 dx, dy로 설정하여 코드를 단축화하였다.

 

 

 

 

728x90
반응형