본문 바로가기
알고리즘/프로그래머스

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

by Bhinney 2023. 10. 24.
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


❓ 문제

 

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


제한사항
  • n은 1 이상 1,000 이하입니다.

 


📎 예시


📎 풀이 설명

  • n에 들어오는 값에 따라 반환할 배열의 길이가 어떻게 달라지는지 확인하였다.
  • 따라서 반환할 배열의 길이를 구해 반환할 값을 선언해주었다.
/*
* n = 1 -> 1
* n = 2 -> 3
* n = 3 -> 6
* n = 4 -> 10
* n = 5 -> 15
* n = 6 -> 21
* n = 7 -> 28
*/

public static int[] solution(int n) {
   int[] ans = new int[n * (n + 1) / 2];
   
   return ans;
}

  • 해당 문제는 이차원 배열로 푼 후, 일차원 배열의 값에 넣어주어야 한다고 판단했다.
  • 그래서 이차원 배열을 하나 만들어주었다.
/*
1
2  18
3  19  17
4  20  27  16
5  21  28  26  15
6  22  23  24  25  14
7  8   9   10  11  12  13
*/

public static int[] solution(int n) {
   int[] ans = new int[n * (n + 1) / 2];
   int[][] arr = new int[n][n];
   
   return ans;
}

  • 이차원 배열 안에서 아래로 움직이거나 옆으로 움직이거나 대각선 위로 움직이며 값을 넣어주어야 한다.
  • 처음에 이걸 어떻게 판단할 수 있을지 고민하였다.
  • 그리고 검색을 통해, 3으로 나눈 나머지 값으로 움직이는 방향을 판단할 수 있다는 것을 알게 되었다.
  • 시작할 x값을 -1로 할당하고, y값을 0, 값을 넣어줄 num을 1로 할당해주었다.
  • 이중 반복문을 돌며, i를 3으로 나눈 나머지 값에 따라 x와 y값에 변화를 주었다.
  • 세로로 움직일 경우, x의 값을 더해주었다.
  • 가로로 움직일 경우, y의 값을 더해주었다.
  • 대각선으로 움직일 경우, x와 y의 값을 빼주었다.

public static int[] solution(int n) {
   ...
   
   int x = -1;
   int y = 0;
   int num = 1;
   
   for(int i = 0; i < n; i++) {
      for (int j = i; j < n; j++) {
         if(i % 3 == 0) {
            x++;
         } else if (i % 3 == 1) {
            y++;
         } else {
            x--;
            y--;
         }
         
         arr[x][y] = num;
         num++;
      }
   }
   
   return ans;
}

  • 반복문을 돌며, 반환될 배열에 값을 넣어주었다.
public static int[] solution(int n) {
   ...
   
   int idx = 0;
   for(int i = 0; i < n; i++) {
      for(int j = 0; j <= i; j++) {
         ans[idx] = arr[i][j];
         idx++;
      }
   }
   
   return ans;
}

✍🏻 최종 풀이

public static int[] solution(int n) {
   int[] ans = new int[n * (n + 1) / 2];
   int[][] arr = new int[n][n];
   
   int x = -1;
   int y = 0;
   int num = 1;
   
   for(int i = 0; i < n; i++) {
      for (int j = i; j < n; j++) {
         if(i % 3 == 0) {
            x++;
         } else if (i % 3 == 1) {
            y++;
         } else {
            x--;
            y--;
         }
         
         arr[x][y] = num;
         num++;
      }
   }
   
   int idx = 0;
   for(int i = 0; i < n; i++) {
      for(int j = 0; j <= i; j++) {
         ans[idx] = arr[i][j];
         idx++;
      }
   }
   
   return ans;
}

댓글