본문 바로가기
[ 다먹살 ]/- Coding

[프로그래머스] 레벨2 삼각달팽이

by 엉망으로살기 2021. 9. 23.
반응형

https://programmers.co.kr/learn/courses/30/lessons/68645?language=java 

 

코딩테스트 연습 - 삼각 달팽이

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]

programmers.co.kr

 

문제의 설명 자체가 굉장히 심플했다. 입력 받은 n에 대해 반시계 방향으로 값을 채운 후, 그 결과를 1차원 배열로 출력하면 되는 문제였다. 나는 방향을 기준으로 ↓, →, ↖ 이렇게 3개로 나누어서 각각 방향에 맞게 구현했다.

 

1. 달팽이 채우기에 필요한 최대 값(end)을 구하고, 필요한 변수들을 선언한다.

   1-1. temp : 임시로 사용하는 2차원 배열(전체 배열의 반만큼 공간을 사용)

   1-2. value : 최대 end값까지 늘어나면서 배열의 값을 +1 해준다.

   1-3. gijun : 각각 배열 값이 늘어나는 방향 ↓, →, ↖ 와 대응시키는 1, 0, -1을 이용해 방향을 설정한다.

   1-4. cnt : 현재 방향으로 늘어나고 있는 개수로, 최대 max개까지 늘어나게 된다.

   1-5. max : cnt의 종료조건에 해당하는 변수로, 방향이 바뀔떄마다 -1 해준다.

2. 현재 배열 값(value)이 최대 값(end)에 도달하기 전까지 아래의 루프를 반복한다.

   2-1. gijun이 1일 경우(↓) : 종료조건 값(max)에 도달하기 전까지 아래로 값(value)을 증가시키고, 다음 진행방향(gijun)을 →로 변경

   2-2. gijun이 0일 경우(→) : 종료조건 값(max)에 도달하기 전까지 오른쪽으로 값(value)을 증가시키고, 다음 진행방향(gijun)을 ↖로 변경

   2-3. gijun이 0일 경우(↖) : 종료조건 값(max)에 도달하기 전까지 왼쪽 위로 값(value)을 증가시키고, 다음 진행방향(gijun)을 ↓로 변경

 


문제 및 입출력

 


코드

class Solution
{
    public static int[] solution(int n)
    {
        int[][] temp = new int[n][n];
        int end = ((n*(n+1))/2)+1; // 마지막 배열의 수
        
        int value = 1; // 현재 배열의 수
        int gijun = 1; // 배열 값이 늘어나는 방향(1, 0, -1)
        
        int cnt = 0; // 현재 방향의 개수(최대 max개)
        int max = n; // 최대 경계범위(방향이 바뀔떄마다 -1)
        
        // 배열의 현재 좌표(방향이 바뀔떄마다 값 갱신)
        int x = 0;
        int y = 0;
        
        while(value!=end)
        {
            if(gijun==1) // ↓ 방향
            {
                while(cnt!=max)
                {
                 temp[x+cnt][y] = value;
                    cnt++;
                    value++;
                }
                
                x = x+cnt-1;
                gijun = 0; // → 방향으로 변경
                max--;
                cnt = 0;
                y++;
            }
            else if(gijun==0) // → 방향
            {
             while(cnt!=max)
             {
                 temp[x][y+cnt] = value;
                    cnt++;
                    value++;
             }
            
                y = y+cnt-1;
                gijun = -1; // ↖ 방향으로 변경
                max--;
                cnt = 0;
                x--;
                y--;
            }
            else if(gijun==-1) // ↖ 방향
            {
             while(cnt!=max)
             {
                 temp[x-cnt][y-cnt] = value;
                    cnt++;
                    value++;
             }
            
             x = x-cnt+1;
             y = y-cnt+1;
                gijun = 1; // ↓ 방향으로 변경
                max--;
                cnt = 0;
                x++;
            }
        }
        
        int[] answer = new int[value-1];
        value = 0;
        
        for(int i=0; i<temp.length; i++)
        {
         for(int j=0; j<temp[0].length; j++)
         {
         if(temp[i][j]!=0)
         {
         answer[value] = temp[i][j];
         value++;
         }
         }
        }
        
        return answer;
    }
}

 

반응형

댓글