프로그래머스 코딩 문제 2021/04/23 - Lv.2 삼각 달팽이

이호현·2021년 4월 23일
0

Algorithm

목록 보기
109/138

[문제]

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


제한사항

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

입출력 예

n result
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]

[풀이]

function solution(n) {
  const answer = [];
  const length = n * (n + 1) / 2;
  let index = 0;
  let min = 1;
  let max = n - 1;
  let dir = 'd';
  let round = 0;

  for(let i = 0; i < n; i++) {
    answer.push([]);
  }

  for(let i = 0; i < length; i++) {
    if(dir === 'd') {
      answer[index].splice(round, 0, i + 1);

      if(index === max) {	// 오른쪽으로 꺾음
        dir = 'r';
        max--;
      }
      else {
        index++;
      }
    }
    else if(dir === 'r') {
      round ? answer[index].splice(-1 * round, 0, i + 1) : answer[index].push(i + 1);
      // 첫 바퀴에는 마지막에 붙여야되니 push

      if(answer[index].length === index + 1) {		// 위로 꺾음
        dir = 'u';
        index--;
      }
    }
    else {
      round ? answer[index].splice(-1 * round, 0, i + 1) : answer[index].push(i + 1);
      // 첫 바퀴에는 마지막에 붙여야되니 push

      if((index === min) || answer[index].length === index + 1) {	// 아래로 꺾음
        dir = 'd';
        min++;
        round++;
        index++;
      }
      else {
        index--;
      }
    }
  }

  return answer.flat();
}

현재 높이 index, 올라가다 아래로 꺾을 위치 min, 내려가다 오른쪽으로 꺾을 위치 max, 방향을 나타내는 변수 dir, 몇 바퀴째 도는지 체크할 round를 만듦.

등차수열 합으로 추가할 숫자 개수를 구하고, 그 만큼 반복문을 돌림.

마지막에 2차원 배열을 flat()으로 1차원 배열로 바꿈.

profile
평생 개발자로 살고싶습니다

0개의 댓글