본문 바로가기

코딩테스트 연습/프로그래머스

[ 프로그래머스 / 월간 코드 챌린지 시즌1] LEVEL 2 - 삼각 달팽이 : solved by Java

 

문제 설명

정수 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]

 

 

[ 풀이 코드 ]

import java.util.*;
class Solution {
    public int[] solution(int n) {
        int N = n*(n+1)/2;
        int[] answer = new int[N];
        int ind=1;
        int [][] arr = new int[n][n];
        int c = n-1;
        int i = -1; // 시작점
        int j = 0;
        while(ind<=N&& c>0){
            for(int k =0; k<c;k++){
                arr[++i][j]= ind++;
            }
            if (ind>N) break;
            i++;j--;
            for(int k = 0; k<c; k++){
                arr[i][++j] = ind++;
            }
            i++;j+=2;
            for(int k = 0; k<c; k++){
                arr[--i][--j] = ind++;
            }
            c-=3;
        }
        if(c==0){
            arr[++i][j] = ind;
        }
        int ans = 0; 
        for(i =0; i<n; i++){
            for(j =0; j< n; j++){
                if(arr[i][j]!=0){
                    answer[ans++] = arr[i][j];
                }
            }
        }
        return answer;
    }
}

진짜 진지하게 같은 level2인데 이렇게 차이나도 되나 싶다. 이 전에 푼거랑은 넘 다른데...

설명을 잘 써두면 쉽게 풀 수 있답. 

1    0   0   0   0    0 
2   15   0   0   0    0 
3   16  14   0   0    0
4   17  21  13   0    0 
5   18  19  20  21    0
6    7   8   9  10   11

이런 식으로 배열을 선언할 생각을 하고,  

(0,0)->(1,0)->(2,0)->(3,0)->(4,0)   (5,0)->(5,1)->(5,2)->(5,3)->(5,4)   (5,5)->(4,4)->(3,3)->(2,2)->(1,1)
(2,1)->(3,1)                        (4,1)->(4,2)                        (4,3)->(3,2)

이런식으로 배열에 넣었다. 

 1    0   0   0   0    0 
  2   12   0   0   0    0 
  3   13  11   0   0    0
  4   14  15  10   0    0 
  5    6   7  8    9    0

이이 것도 

(0,0)->(1,0)->(2,0)->(3,0)        (4,0)->(4,1)->(4,2)->(4,3)          (4,4)->(3,3)->(2,2)->(1,1)
(2,1)-                            (3,1)                               (3,2)

요오런식 

그리고 위에 코드를 보면 쏙쏙 이해가 쉬운 문제라고 생각한다. 

 

효율성은 요오 정도