본문 바로가기
일반 학습/코딩 테스트

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

by StelthPark 2022. 3. 25.

처리 조건

풀이

달팽이가 위에서부터 도는 모양을 생각해보자

위에서부터 n만큼 내려가고 n-1만큼 오른쪽으로가고 n-2만큼 위로 다시 올라가며 빙글빙글 돌게된다.

반복없이 여기까지만 구해본다면 맨위부터 n만큼 배열을 만들어 내부에서 일치하는 인덱스에 값을 담아줘야한다.

count는 들어갈 숫자로 0부터 시작하게되며 x=-1 y=0으로 왼쪽부터 대각선으로 내려가는 for문을 돌린다.

0부터 4전까지 x축을올리며 count를 올리며 할당해준다. 맨아래에서 오른쪽으로 가는 for문을 돌린다. n-1인 0부터 3전까지 돌리게 되며 x는 그대로두고 y축을 +1해주면서 count++를 하며 값을 저장시킨다. 오른쪽 위로 진행되는 대각선 for문을 돌린다. n-2인 0부터 2까지 돌리게되며 x와y축 둘다 -하며 count++를 하며 값을 저장시킨다.

 

여기까지 돌리게 되면 바깥을 한번 빙빙 돌았지만 안에는 못돌았다 그래서 아래처럼 값이 나온다

x자리에 10까지 들어가야한다. 이제 전체를 while문을 돌릴 것이고 다음 안쪽에서 빙글빙글 돌 로직을 짜주어야한다.

n을 변화를 줄건데 -3을 빼주면된다. 그이유는 n만큼 처음 한바퀴를 돌고나면 안에서는 -3만큼 인 n까지 for문을 돌리면 되는데 

이렇게 -3인만큼 횟수가 움직이기 때문이다. n이 4일때 우리는 왼쪽면 대각선을 구할때 n을 4전까지 돌렸고. 즉 for문으로 i는 3까지 그리고 안에 있는 면이 1개만 만든다면 for문의 i가 0까지 이므로 n-3을 해준값을 n에다가 넣어주면 된다.

while문은 n이 1이상일때까지만 돌아가게 된다. 0이면 for문안에서 let i=0 이 i<0까지 이니 작동안하고 작동시킬 필요도 없으니까!

 

function solution(n) {
  const answer = new Array(n).fill().map((_, index) => {
    return new Array(index + 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 -= 4;
  }

  return answer.flatMap((e) => e);
}

댓글