자바/코딩테스트

[프로그래머스] 삼각 달팽이 - Java(자바)

대전집주인 2024. 4. 9. 15:11
728x90
SMALL

 

1 0 0 0
2 9 0 0
3 10 8 0
4 5 6 7

문제 이해

  • 소용돌이 문제와 유사하다. 실제로는 2차원 배열로 넣었을때 위와 같은 모양을 띈다.
  • x 증가 -> x의 끝 도달 -> y 증가 -> y의 끝 도달 -> x 감소 y 감소 이런식의 반복이 이루어진다.
  • bfs 방식으로 방문했는지 안했는지를 값이 0이냐 아니냐로 비교하였다.
  • 방문여부 || x, y 좌표의 위치에 따라 dir값 (0 - 왼쪽 대각선 아래, 1 - 오른쪽, 2 - 왼쪽 대각선 위) 세팅해준다.
  • 배열의 총 개수는 순차수열로 생성하였고 배열의 개수만큼 num이 증가하면 while문을 나오게 만들었다.
import java.util.*;
class Solution {
    public int[] solution(int n) {
        int[][] arr = new int[n][n];
        int dir = 0; // 0 - 왼쪽 대각선 아래, 1 - 오른쪽, 2 - 왼쪽 대각선 위
        int[] dp = new int[n+1];
        dp[1] = 1;
        
        // 3-6, 4-10, 5-15, 6-21
        for(int i = 1; i<=n; i++){
            dp[i] = dp[i-1] + i;
        }
        int[] answer = new int[dp[n]];

        int num = 1;
        int x = 0;
        int y = 0;
        
        while(true){
            arr[x][y] = num;
            
            if(dir == 0 && (x == n-1 || (x < n-1 && arr[x+1][y] != 0 ))){
                dir = 1;
            }else if(dir == 1 && (y == n-1 || (y < n-1 && arr[x][y+1] != 0))){
                dir = 2;
            }else if(dir == 2 && (x > 0 && arr[x-1][y-1] != 0)){
                dir = 0;
            }
            
            if(dir == 0){
                x++;    
            }else if(dir == 1){
                y++;
            }else if(dir == 2){
                x--;
                y--;
            }
            
            if(num == dp[n]) break;
            num++;
        }
        
        int index = 0;
        for(int i = 0; i<n; i++){
            for(int j = 0; j<n; j++){
                if(arr[i][j] != 0){
                    answer[index++] = arr[i][j];
                }
            }   
        }
            
        return answer;
    }
}
728x90
LIST