프로그래머스 문제풀이 - 삼각 달팽이 (Javascript)

alvin·2021년 1월 31일
0

알고리즘

목록 보기
2/10

문제

https://programmers.co.kr/learn/courses/30/lessons/68645

코드

function solution(n) {
    const answer = new Array(n).fill().map((_, i) => new Array(i + 1));
    
    let count = 0;
    let x = -1;
    let y = 0;
    while (n > 0) {
        for (let i = 0; i < n; i++) answer[++x][y] = ++count;
        for (let i = 0; i < n - 1; i++) answer[x][++y] = ++count;
        for (let i = 0; i < n - 2; i++) answer[--x][--y] = ++count;
        n -= 3;
    }
    
    return answer.flatMap(e => e);
}

풀이

실제로 배열을 빙글빙글 돌면서 채우면 쉽게 풀리는 문제입니다.

이 문제에서 제시하는 방식(반시계 방향으로 달팽이 채우기)은 아래 3단계가 계속해서 반복되는 방식입니다.

  1. 아래로 내려가면서 값을 채움
  2. 옆으로 가며 값을 채움
  3. 다시 위로 올라가며 값을 채움

따라서, 주어진 n값에 알맞게 2차원 배열을 만들어주고, x, y 좌표값을 수정하며 배열을 채워나가면 됩니다.

그리고, 또다른 규칙이 있습니다.

주어진 n이 6이라면, 첫 1단계에서 아래로 가며 6개의 빈칸을 채우고, 2단계에서 옆으로 가며 5개의 빈칸을 채우고, 3단계에서 위로 가며 4개의 빈칸을 채우게 됩니다.

[
  [1],
  [2, 15],
  [3, , 14],
  [4, , , 13],
  [5, , , , 12],
  [6, 7, 8, 9, 10, 11],
]

그리고 다음 루프에서는 아래로 가며 3개의 빈칸을 채우고, 옆으로 가며 2개의 빈칸을 채우고, 위로 가며 마지막 1개의 빈칸을 채우면 배열이 모두 채워집니다.

[
  [1],
  [2, 15],
  [3, 16, 14],
  [4, 17, 21, 13],
  [5, 18, 19, 20, 12],
  [6, 7, 8, 9, 10, 11],
]

즉, 주어진 n이 6일 때, 각각의 단계에서 이동 횟수는 6 -> 5 -> 4 -> 3 -> 2 -> 1로 n에서 1씩 줄어든다는 것을 알 수 있습니다.

따라서 최상위 루프 1회 당 3개의 단계를 거치므로 그에 맞게 중첩 for문 각각의 순회 횟수를 잘 설정해주고, n -= 3을 해주면 됩니다.

profile
주니어 웹 프론트엔드/백엔드 개발자 입니다. 서브 프로젝트를 굉장히 좋아하고, velog에 기록으로 남기고 있습니다.

0개의 댓글