본문 바로가기
Baekjoon

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

by kssosoy 2025. 7. 9.

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

1. 정답

class Solution {
    public int[] solution(int n) {
        
        int num=n*(n+1)/2;
        
        int[][] matrix = new int[n][n];
        int c=1;
        int d=n;
        int[] state= {0,1,2};
        int x=-1, y=0;
        //0 : 아래, 1: 오른쪽 ,2 :대각선 위
        while(c<=num){
            for(int s : state){
                if(s==0){
                    for(int i=0; i<d; i++){
                        x++;
                        matrix[x][y]=c;
                        c++;
                    }
                    d--;
                    
                }
                else if(s==1){
                     for(int i=0; i<d; i++){
                        y++;
                        matrix[x][y]=c;
                        c++;
                    }
                    d--;
                    
                }
                else{
                    for(int i=0; i<d; i++){
                        x--;
                        y--;
                        matrix[x][y]=c;
                        c++;
                    }
                    d--;
                    
                }
                
            }
            
        }
        int[] answer = new int[num];
        int idx=0;
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                if(matrix[i][j]!=0){
                    answer[idx++]=matrix[i][j];
                }
            }
        }
        return answer;
    }
}

 

2. 접근 

처음에는

피보나치 수열처럼 배열의 인덱스에 규칙이 있지 않을까 생각해봤는데 규칙을 못찾았다

두번째로 생각한 접근은

이렇게 방향대로 반복되는 것을 발견할 수 있었다.

방향이 바뀔때마다 n-1로 줄어들었고

이를 적용하면 쉽게 풀 수 있는 문제였다.

 

첫번째 케이스를 예로 들자면

0
1 8
2 9 7
3 4 5 6
 n=4

 

이런식으로 배열에 저장된다

그럼 방향은 3가지가 존재하는 것을 알 수 있는데 -> 아래, 오른쪽, 대각선 위의 3가지 케이스가 생긴다

 

1. 아래 방향

행이 1씩 커진다

따라서 

if(s==0){
                    for(int i=0; i<d; i++){
                        x++;
                        matrix[x][y]=c;
                        c++;
                    }
                    d--;
                    
                }

이런식으로 

행의 인덱스가 1씩 커지고 저장되는 값 c의 값도 1씩 증가한다

d를 통해 다음 방향에서 n-1만큼 배열에 저장할 수 있도록 해준다.

 

2. 오른쪽 방향

else if(s==1){
                     for(int i=0; i<d; i++){
                        y++;
                        matrix[x][y]=c;
                        c++;
                    }
                    d--;
                    
                }

열의 인덱스가 1씩 커지도록 한다

 

3. 대각선 위 방향

 else{
                    for(int i=0; i<d; i++){
                        x--;
                        y--;
                        matrix[x][y]=c;
                        c++;
                    }
                    d--;
                    
                }

행과 열이 1씩 작아진다

 

4. 출력

배열에 저장된 값 중에 0 이 아닌 값만 answer에 저장하여 return

'Baekjoon' 카테고리의 다른 글

[백준] 1918- 후위표기식[Python]  (0) 2025.07.13
[백준] 후위표기식 -[Python]  (0) 2025.07.10
[백준] 16929 - Two Dots [JAVA]  (0) 2025.07.08
[백준] 7562- 나이트의 이동[JAVA]  (0) 2025.07.06
[백준] 4963 - 섬의 개수 [JAVA]  (0) 2025.07.03