프로그래머스[Level 2] 삼각 달팽이

bkboy·2022년 6월 28일
0

문제

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

제한 사항

  • n은 1 이상 1,000 이하입니다.

입출력 예

풀이

const solution = (n) => {
  // 삼각형태
  const arr = new Array(n).fill().map((_, idx) => new Array(idx + 1));

  // 삽입용
  let count = 0;

  let x = -1;
  let y = 0;

  while (n > 0) {
    for (let i = 0; i < n; i++) arr[++x][y] = ++count;
    for (let i = 0; i < n - 1; i++) arr[x][++y] = ++count;
    for (let i = 0; i < n - 2; i++) arr[--x][--y] = ++count;

    n -= 3;
  }

  const answer = [];
  arr.forEach((e) => {
    for (let x of e) {
      answer.push(x);
    }
  });
  return answer;
};

우선 삼각형태를 나타낼 수 있게 배열안에 배열을 넣어 이차원 배열을 만들었다.
몇개의 요소가 들어가는 배열인지 정해져 있어야한다.

문제의 n=4일 경우의 숫자순서대로 좌표를 나열해보겠다.

(0,0) => (1,0) => (2,0) => (3,0)
1 2 3 4
(3,1) => (3,2) => (3,3)
5 6 7
(2,2) => (1,1)
8 9
(1,2) ....
10

움직이는 방향이 바뀔 때 줄을 바꿔서 나열했다. 첫번째 줄은 아래로 이동
두번째 줄은 오른쪽으로 이동, 세번째 줄은 대각선 위로 이동한다.

아래로 4번 이동하고 오른쪽으로 3번 이동하고 대각선 위로 2번이동하고 다시 아래로 1번 이동한다.
이 규칙을 따르면 반복문의 횟수를 줄여가면서 이동을 시키면 된다.

여기에 해당하는 부분이 코드의 while문이다.

n의 값을 줄여가면서 0이 될 때까지 반복하면 배열을 다 채울 수 있다.

const solution = (n) => {
 const arr = new Array(n).fill().map((e, i) => new Array(i + 1));

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

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

   n -= 3;
 }
 const answer = [];

 for (let tmp of arr) {
   answer.push(...tmp);
 }

 return answer;
};

마지막에 합치는 부분을 조금 바꾸었다.

profile
음악하는 개발자

0개의 댓글