본문 바로가기
Algorithm

[프로그래머스] 2️⃣ 삼각 달팽이 (JAVA)

by 옥돔이와 연근이 2024. 4. 18.
728x90
반응형

삼각 달팽이

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

!https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/e1e53b93-dcdf-446f-b47f-e8ec1292a5e0/examples.png


제한사항

  • n은 1 이상 1,000 이하입니다.

입출력 예

n result

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]

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • 문제 예시와 같습니다.

📍 기존 풀이


import java.util.*;

class Solution {
    public int[] solution(int n) {
        int [] dy={1,0,-1};
        int [] dx={0,1,-1};
        
        int num = 1;
        int[][] arr = new int [n][n];
        int x=0, y=0;
        
        while(true){
         // 1. 아래로 이동 
            while(true){
                arr[y][x]= num++;
                    
                int ny = y+dy[0];
                int nx = x+dx[0];
                
                if (ny==n || arr[ny][x] !=0) break;
                x=nx;
                y=ny;
            }
            
            if (x+1==n || arr[y][x+1] !=0) break;
            //오른쪽으로 한칸 이동
            x+=1;
            
        // 2. 오른쪽으로 이동 
            while(true){
                arr[y][x]= num++;
                    
                int ny = y+dy[1];
                int nx = x+dx[1];
                
                if (nx==n || arr[y][nx] !=0) break;
                x=nx;
                y=ny;   
            }
            if (y-1==-1 || x-1== -1 || arr[y-1][x-1] !=0) break;
            y-=1;
            x-=1;
            
        // 3. 대각선 위로 이동
            while(true){
                arr[y][x]= num++;
                
                int ny = y+dy[2];
                int nx = x+dx[2];
                
                if (arr[ny][nx] != 0 || ny==-1 || nx == -1) break;
                x=nx;
                y=ny;   
                
            }
            if (arr[y+1][x] != 0 || y+1==n ) break;
            y+=1;
            
        }
        
        int[] answer = new int [num-1];
        int count=0;
        
        for (int i=0; i< n; i++){
            for (int j=0; j<n; j++){
                if (arr[i][j]!=0){
                answer [count++] = arr[i][j];
                }
            }
        }
        
        return answer;
    }
}

👍더 나은 풀이👍

<aside> 📌 세 방향을 따로하는 것이 아니라 , 방향 벡터를 이용해서 한번에 처리하도록 함 0(아래) → 1(오른쪽 ) → 2(왼쪽 위)

// 2를 넘어가게 되면 다시 0으로 돌아올 수 있도록 나머지 연산자 사용 d=(d+1)%3

import java.util.*;

class Solution {
    private static final int []dx={0,1,-1};
    private static final int []dy={1,0,-1};
    
    
    public int[] solution(int n) {
        int d=0; // 방향처리 변수
        int num = 1;
        int[][] arr = new int [n][n];
        int x=0, y=0;
        
        while(true){
            arr[y][x]=num++;
            
            int nx = x+dx[d];
            int ny = y+dy[d];
            
            if (nx == n || ny == n|| nx == -1||ny == -1 || arr[ny][nx]!=0) {
                d =(d+1) % 3;
                nx = x+dx[d];
                ny = y+dy[d];
                
                if (nx == n || ny == n|| nx == -1|| ny == -1|| arr[ny][nx]!=0) break;
            }
            
            x=nx;
            y=ny;
        }
        
        int [] answer = new int [num - 1];
        int index =0;
        
        for (int i=0; i<n; i++){
            for (int j=0; j<=i; j++){
                answer[index++] = arr[i][j];
            }
        }
        
        
        return answer;
    }
}

</aside>

728x90