제출 코드(통과)
using System;
public class Solution {
public int[] solution(int n)
{
var size = n * (n + 1) / 2;
var answer = new int[size];
var index = 0;
var count = 1; // 1, 2, 3, ..., size
var phase = 0; // 0: down, 1: right: 2: up
var temp = 0; // to calc next index
while (count <= size)
{
answer[index] = count++;
var next = index;
switch (phase)
{
case 0:
next += (++temp);
if (next >= size || answer[next] > 0)
{
phase = 1;
next = index + 1;
}
break;
case 1:
next += 1;
if (next >= size || answer[next] > 0)
{
phase = 2;
next = index - (temp--);
}
break;
case 2:
next -= (temp--);
if (next < 0 || answer[next] > 0)
{
phase = 0;
next = index + (++temp);
}
break;
}
index = next;
}
return answer;
}
}
어렵게 생각하지 않고, 달팽이 방향으로 다음 인덱스를 찾아가며 숫자를 순서대로 채워넣었다. phase를 구분하여 다음 인덱스를 계산하고, 인덱스 범위를 벗어나거나 이미 채워진 곳이라면 방향을 바꾸어야 하므로 phase를 변경한다.