삼각 달팽이

Lv. 2

Solution

interface Position {
  y: number;
  x: number;
}
 
export function solution(n: number): number[] {
  const result = Array.from({ length: n }).map((_, i) => new Array(i + 1).fill(0));
 
  function nextPosition(position: Position, direction: number): Position {
    const dy = [1, 0, -1];
    const dx = [0, 1, -1];
    return {
      y: position.y + dy[direction],
      x: position.x + dx[direction],
    };
  }
 
  let position = {
    y: -1,
    x: 0,
  };
  let value = 0;
  let direction = 0;
  for (let i = n; 0 < i; i--) {
    for (let j = 0; j < i; j++) {
      position = nextPosition(position, direction);
      result[position.y][position.x] = ++value;
    }
    direction = (direction + 1) % 3;
  }
 
  return result.flatMap((row) => row);
}