문제 설명
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 1,000 이하입니다.
입출력 예
nresult
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] |
문제 풀이
우선 5X5표에서 직각삼각형으로 수를 대입하는 것을 생각해보자
1)번 표는 5X5 배열에 직삼각형 모양으로 순서대로 숫자를 채워넣은 것이고,
2)번 표는 5X5 배열에 삼각 달팽이 모양으로 숫자를 채워넣은 것이다.
이 두 표를 비교해보면 삼각 달팽이의 규칙성을 찾을 수 있다.
우선 삼각 달팽이는 아래로, 오른쪽으로, 대각선방향의 3가지 패턴순 이동하면서 숫자를 채워넣는다.
따라서 우리는 각 패턴이 1번 배열에서 어디에 위치하는지, 어떤 연관성이 있는지 살펴볼 것이다.
우선 아래방향으로 이동하는 경우이다.
이는 원래 배열에서 0행, 3행에 위치해있다.
즉 이를 확장하면, 3으로 나눈 나머지가 0인 행에 위치해있는 것이다.
다음은 오른쪽으로 이동하는 경우이다.
이는 원래 배열에서 1행, 4행에 위치해있다.
즉 이를 확장하면 3으로 나눈 나머지가 1인 행에 위치해있는 것이다.
마지막으로 대각선으로 이동하는 경우이다.
이는 원래 배열에서 2행에 위치해있다.
즉 3으로 나눈 나머지가 2인 경우이다.
3가지 패턴을 분석한 결과를 정리해보면
1번 배열에서 3으로 나눈 나머지가 0인 행은 삼각 달팽이 배열에서 아래 방향으로 숫자를 채워넣는 것과 동일하다.
1번 배열에서 3으로 나눈 나머지가 1인 행은 삼각 달팽이 배열에서 오른쪽 방향으로 숫자를 채워넣는 것과 동일하다.
1번 배열에서 3으로 나눈 나머지가 2인 행은 삼각 달팽이 배열에서 대각선 방향으로 숫자를 채워넣는 것과 동일하다.
이를 코드로 나타내면 다음과 같다.
Solution.java
class Solution {
public int[] solution(int n) {
int[][] arr =new int[n][n];
int[] answer = new int[n*(n+1)/2];
int y=-1, x=0;
int num=1;
for(int i=0 ;i<arr.length; i++){
for(int j=i;j<n;j++){
//아래로 움직이는 경우
if(i%3==0)
y++;
//오른쪽으로 움직이는 경우
else if(i%3==1)
x++;
//대각선으로 움직이느 경우
else{
x--; y--;
}
arr[y][x]=num++;
}
}
for(int i =0, cnt=0; i<arr.length;i++){
for(int j=0;j<arr.length;j++){
if(arr[i][j]!=0){
answer[cnt]=arr[i][j];
cnt++;
}
}
}
return answer;
}
}
'프로그래머스 > LEVEL2' 카테고리의 다른 글
스킬트리 (0) | 2021.01.31 |
---|---|
124 나라의 숫자 (0) | 2021.01.31 |
프린터 (0) | 2021.01.31 |
기능개발 (0) | 2021.01.31 |
다리를 지나는 트럭 (0) | 2021.01.31 |