Where who wants to meet someone
정수를 나선형으로 배치하기 본문
728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/181832?language=swift
내 답안 / 다른 사람들의 답안
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 |