Where who wants to meet someone

정수를 나선형으로 배치하기 본문

프로그래머스 알고리즘 문제 기록/코딩 기초 트레이닝

정수를 나선형으로 배치하기

Lust3r 2024. 5. 10. 11:06
728x90

문제

https://school.programmers.co.kr/learn/courses/30/lessons/181832?language=swift

 

프로그래머스

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

programmers.co.kr

 

내 답안 / 다른 사람들의 답안

import Foundation

func solution(_ n:Int) -> [[Int]] {
    var result = Array(repeating: Array(repeating: 0, count: n), count: n)
    let points = [[0, 1], [1, 0], [0, -1], [-1, 0]]

    var x = 0, y = 0, dir = 0, currentNum = 1

    while currentNum <= n * n {
        result[x][y] = currentNum

        var nextX = x + points[dir][0]
        var nextY = y + points[dir][1]

        if (nextX >= n || nextX < 0 || nextY >= n || nextY < 0 || result[nextX][nextY] != 0) {
            dir = (dir + 1) % 4
            nextX = x + points[dir][0]
            nextY = y + points[dir][1]
        }

        x = nextX
        y = nextY

        currentNum += 1
    }

    return result
}

- currentNum이 n의 제곱만큼 채워져야 하므로 범위 설정

- currentNum을 현재 위치에 저장하고, 다음 좌표를 설정. 다음 좌표가 배열 범위를 벗어나면 dir값을 조정하여 경로를 재설정한 뒤 x, y에 저장

- currentNum을 1 증가시켜 반복

 

- 처음에는 y값만 1씩 늘려 이동하면서 값을 저장하고, 오른쪽 끝에 도착하여 nextY >= n 조건이 되면 dir 값을 변경시켜 points의 다음 요소[1, 0]을 사용. 그러면 다음 좌표는 x가 1 늘어나고 y는 변화가 없게 된다. 즉 배열 오른쪽 끝의 아랫줄로 이동하는 것.

- 이렇게 배열 우측 하단까지 이동하고 나면 nextX가 >= n 조건에 걸리기 때문에 dir 값을 변경시키고, points의 다음 요소 [0, -1]을 사용. 그러면 다음 좌표는 x는 유지되고 y가 1씩 줄어든다. 즉 해당 위치에서 왼쪽으로만 이동한다(배열의 맨 아랫줄 시계방향).

- 위 조건 외에도 맨 위로 올라갔을 때 0보다 작은 경우, 혹은 다음 좌표에 이미 값을 넣어 0이 아닌 경우에도 dir 값을 변경시키면 나선형으로 값을 넣을 수 있다.

 

// 풀이 1
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, dir = 0
    for i in 1...n * n {
        answer[x][y] = i
        let nx = x + dx[dir], ny = y + dy[dir]
        if nx < 0 || ny < 0 || nx >= n || ny >= n || answer[nx][ny] != 0 { 
            dir = (dir + 1) % 4
            x += dx[dir]; y += dy[dir]
        } else {
            x = nx; y = ny
        }
    }
    return answer
}

// 풀이 2
import Foundation

func solution(_ n: Int) -> [[Int]] {
    var result = [[Int]](repeating: [Int](repeating: 0, count: n), count: n)
    var value = 1
    var row = 0
    var col = 0

    while value <= n*n {
        // right direction
        while col < n && result[row][col] == 0 {
            result[row][col] = value
            value += 1
            col += 1
        }
        col -= 1
        row += 1

        // down direction
        while row < n && result[row][col] == 0 {
            result[row][col] = value
            value += 1
            row += 1
        }
        row -= 1
        col -= 1

        // left direction
        while col >= 0 && result[row][col] == 0 {
            result[row][col] = value
            value += 1
            col -= 1
        }
        col += 1
        row -= 1

        // up direction
        while row >= 0 && result[row][col] == 0 {
            result[row][col] = value
            value += 1
            row -= 1
        }
        row += 1
        col += 1
    }

    return result
}

 

점수: +2

'프로그래머스 알고리즘 문제 기록 > 코딩 기초 트레이닝' 카테고리의 다른 글

정사각형으로 만들기  (0) 2024.05.08
그림 확대  (0) 2024.03.19
전국 대회 선발 고사  (0) 2024.03.16
무작위로 K개의 수 뽑기  (0) 2024.02.18
두 수의 합  (0) 2024.02.18