[프로그래머스/JS] 삼각달팽이

코린·2023년 2월 7일
0

알고리즘

목록 보기
10/44
post-thumbnail

문제 설명

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.

입출력 예

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

풀이

우선 이 분 블로그를 참조했습니다!

우선 반시계 방향으로 돌아가는 달팽이입니다. 따라서 움직일 수 있는 방향은 아래로 가기 오른쪽으로 가기 좌상단으로 가기 이렇게 세가지 입니다.

아래오른쪽좌상단
(1,0)(0,1)(-1,-1)

이렇게 생각하시믄 됩니다!

우선 이차원 배열 선언부터 해야겠죠? 하지만 삼각형 형태의 배열이니까

사용
사용사용
사용사용사용

이런 느낌으로 배열을 사용한다고 생각하시면 됩니다!
(아직 마크다운이 서툴러서......ㅎㅎ 너른 이해 부탁드립미다~~후헤헤)

const arr2 = Array.from(Array(5), () => Array(2).fill(null))

이차원 배열을 선언하는 방법 중에 하나인 Array.from을 사용합니다. 5x2 배열에 null 값이 채워진 채로 나오게 됩니다.

const arr2 = Array.from(Array(n), () => Array(n).fill(0))

따라서 우리는 nxn 형태가 필요하므로 위와 같이 선언해줍니다.

let arr = Array.from({ length: n }, (_, index) => Array(index + 1).fill(0));

하지만 블로그를 참고하니 블로그 작성자 분은 처음부터 삼각형 형태의 이차원 배열을 구현하셨습니다. 위처럼 작성하게 되면 [[0],[0,0],[0,0,0],[0,0,0,0]] 과 같은 형태로 만들어지게 됩니다.

 

이차원 배열을 작성했으므로 이제 달팽이 형태로 어떻게 채워넣을지를 고민해야 합니다!

앞서 말했듯이 움직일 수 있는 방향이 3개입니다.
아래 -> 오른쪽 -> 좌상단 순서로 진행되게 됩니다.

4x4 형태의 배열에서 처음 돌아가는 턴을 생각해봅시다.

1) 아래

(0,0)
(1,0)(1,1)
(2,0)(2,1)(2,2)
(3,0)(3,1)(3,2)(3,3)

2) 오른쪽

=(0,0)**
(1,0)(1,1)
(2,0)(2,1)(2,2)
(3,0)(3,1)(3,2)(3,3)

3) 좌상단

=(0,0)**
(1,0)(1,1)
(2,0)(2,1)(2,2)
(3,0)(3,1)(3,2)(3,3)

여기서 규칙을 발견하게 됩니다!

아래쪽인 경우는 n번 반복
오른쪽인 경우는 n-1번 반복
좌상단인 경우는 n-2번 반복

다음턴일 경우는 n= n-3 해주면 동일하게 반복되는 것을 확인할 수 있습니다!

최종 코드

function solution(n) {
    var answer = [];

    let arr = Array.from({ length: n }, (_, index) => Array(index + 1).fill(0));

    const dx=[1,0,-1];
    const dy=[0,1,-1];

    let x=-1; let y=0;
    let cnt =0;


    while(n>0){

        for(let i=0;i<n;i++){
            x++;
            cnt++;
            arr[x][y]=cnt;
        }

        for(let i=0;i<n-1;i++){
            y++;
            cnt++;
            arr[x][y]=cnt;
        }

        for(let i=0;i<n-2;i++){
            y--;
            x--;
            cnt++;
            arr[x][y]=cnt;
        }

        n-=3;
    }

    for (let i = 0; i < arr.length; i++) {
    answer = [...answer, ...arr[i]];
  }



    return answer;
}

블로그 분 껄 많이 참조해서 할 말이 없지만..... 암튼 오늘도 하나 해...결!

profile
안녕하세요 코린입니다!

0개의 댓글