Level 2 ) 삼각달팽이

Doozuu·2023년 6월 30일
0

프로그래머스 (JS)

목록 보기
121/183

문제 설명

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

제한사항

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

풀이

  1. 사이즈만큼 배열 만들기 : n = 4면 [[],[],[],[]]
  2. 왼쪽 먼저 채우기 : n = 4면 [[1],[2],[3],[4]]
  3. 가장 아래 채우기 : [[1],[2],[3],[4,5,6,7]]
  4. 숫자와 인덱스를 증가/감소 시키며 나머지 채우기
    => 이 과정에서 잘못한 부분이 있다. 왼쪽 아래로 다 내려간 다음에 오른쪽을 다 채우고 다시 위로 쭉 올라가야 하는데 그냥 위아래 지그재그로 채워버렸다.
function solution(n) {
    var answer = [];
    for(let i=1;i<=n;i++){
        let arr = Array.from(n);
        answer.push(arr);
    }
    // 왼쪽
    for(let i=0;i<n;i++){
        answer[i].push(i+1);
    }
    // 아래
    for(let i=n+1;i<n+n;i++){
        answer[answer.length-1].push(i);
    }
    let num = n+n; 
    let idx = n-2; 
    // 나머지 채우기
    while(idx < n){
        if(answer[idx].length < idx+1){
            answer[idx].push(num);
            idx--; 
            num++; 
        }else if(answer[idx].length === idx+1){
            idx++; 
        }else{
            continue;
        }
    }
    return answer;
}

문제에서 의도한대로 달팽이 모양으로 채우려면 아래의 세 동작을 반복해주어야 한다.

  1. 위에서 아래로 내려가는 과정
  2. 왼쪽에서 오른쪽으로 이동하는 과정
  3. 아래에서 위로 올라가는 과정
function solution(n) {
  let answer = [];
  let [count, currentX, currentY] = [0, -1, 0];
  let arr = Array.from({ length: n }, (_, index) => Array(index + 1).fill(0));
  while (n > 0) {
    for (let i = 0; i < n; i++) {
      // 위에서 아래로 
      currentX++;
      count++;
      arr[currentX][currentY] = count;
    }
    for (let i = 0; i < n - 1; i++) {
      // 왼쪽에서 오른쪽으로 
      currentY++;
      count++;
      arr[currentX][currentY] = count;
    }
    for (let i = 0; i < n - 2; i++) {
      // 아래에서 위로 
      currentX--;
      currentY--;
      count++;
      arr[currentX][currentY] = count;
    }
    n -= 3;
  }
    
  return arr.flat();
}

https://velog.io/@tnehd1998/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%82%BC%EA%B0%81-%EB%8B%AC%ED%8C%BD%EC%9D%B4-JavaScript

2차원 배열 1차원 배열로 만들기 : arr.flat( )

profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글