삼각 달팽이

Happhee·2022년 2월 3일
0

[ Lv2 ] programmers

목록 보기
9/32
post-thumbnail

📝 삼각 달팽이

나의 JS 코드

✨ 첫번째 시도

반복문을 어떻게 돌려야 할지 고민을 많이 했던 문제이다
처음에는 각각의 x,y좌표를 for문 내에서 변경하면서 작동시켰으나 많은 오류들이 발생하였다

다른 방법을 고민하다 삼각형의 한변의 길이가
n = 6 이면 5 -> 2 로 줄어들고, n = 5 이면 4 -> 1 로 줄어드는 것을 알아냈다
이를 반복 횟수로 활용하여 코드를 작성하였다

삼각형 3변을 움직여야 하기에 while문 안에 반복문이 3개가 들어가 있으며 while문 탈출은 사각형의 개수만큼 반복하는 것이다

👇 해결 코드는 다음과 같다

function solution(n) {
    var answer = [];
    let arrays = new Array(n), sum = 0;
    
  // 0으로 채워진 피라미드 배열을 만들면서
  // 최종적으로 필요한 사각형의 수를 구한다
    for(let i = 0 ; i < arrays.length ; i++){
        arrays[i] = new Array(i+1).fill(0);
        sum += i+1;
    }
    
  // 사각형의 개수를 셀 num과
  // 반복 횟수, x,y좌표를 초기화한다
    let num =1;
    let repeat = n-1, x = 0 , y = 0;
    
  // 총 사각형의 수만큼 반복을 진행
    while(num < sum){
       
      // 삼각형의 좌변 채우기
        for(let k = 0 ; k < repeat ; k++){
            arrays[x][y] = num;
            if(num === sum )
                break;
            num ++;
            x++;
        }
      
   		
      // 삼각형의 밑변 채우기
        for(let k = 0 ; k < repeat ; k++){
            arrays[x][y] = num;
            if(num === sum)
                break;
            num++;
            y++;
        } 
      
      // 삼각형의 우변 채우기
        for(let k =0 ; k < repeat ; k++){
            arrays[x][y] = num;
            if(num === sum )
                break;
            num++;
            y--;
            x--;
        }
        y+=1;
        x+= 2;
        repeat -=3;
      
      // 반복이 0이면 사각형 하나가 남음
        if(repeat === 0){
           arrays[x][y] =num;

       }
        
    }
  // 1이 주어지면 위의 while문이 실행안되므로 
  // 이에 대한 예외처리
    if(num ===1)
        arrays[x][y] = 1
      
   
  // 배열 펼치기~!!!
    return arrays.flat();;
}

✨ 두번째 시도

삼각형으로 채워지는 것이기 때문에, 3변을 순회해야 하므로 3번의 반복을 한세트로 묶어서 진행하면 된다.

또한 x--, y--에 대한 특성을 활용해 해당 증감식 자체를 배열안에 넣어줌으로써 코드를 더 최소화 할 수 있다

최종 코드는 아래와 같다.👇

function solution(n) {
  const arrays = new Array(n).fill().map((_, index) => new Array(index + 1));

  let row = 0;
  let col = -1;
  let count = 1;

  //삼각형은 3변이므로!
  for (let i = n; i > 0; i -= 3) {
    // 왼쪽 -> 아래 -> 오른쪽 탐색
    for (let j = 0; j < i; j += 1) arrays[++col][row] = count++;
    for (let j = 0; j < i - 1; j += 1) arrays[col][++row] = count++;
    for (let j = 0; j < i - 2; j += 1) arrays[--col][--row] = count++;
  }
  return arrays.flat();
}

x,y에 대한 변수명을 의미있는 네이밍인 col, row로 바꾸면서 코드를 작성하였다.

profile
즐기면서 정확하게 나아가는 웹프론트엔드 개발자 https://happhee-dev.tistory.com/ 로 이전하였습니다

0개의 댓글