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,[])