Google 태그 관리자 아이콘

알고리즘 풀이

.leetcode(885. Spiral Matrix III)

silvergoni 2022. 3. 31. 09:45
반응형

https://leetcode.com/problems/spiral-matrix-iii/

 

1. 2022.03.31 시도

소요시간: 21분

class Solution {
    private String[] d = new String[]{"RIGHT", "DOWN", "LEFT", "UP"};
    
    public int[][] spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
        int rowSize = 1;
        int colSize = 1;
        
        int p=rStart;
        int q=cStart;
        
        int[][] ret = new int[rows*cols][2];
        int directionIndex = 0;
        int counter = 0;
        ret[counter++] = new int[]{p, q};
        while(counter != rows*cols) {
            String direction = d[directionIndex];
            
            switch (direction) {
                case "RIGHT":
                    for (int i=0; i<colSize; i++) {
                        if (isAvailable(p, ++q, rows, cols)) {
                            ret[counter++] = new int[]{p, q};
                        }
                    }
                    colSize++;
                    break;
                case "DOWN":
                    for (int i=0; i<rowSize; i++) {
                        if (isAvailable(++p, q, rows, cols)) {
                            ret[counter++] = new int[]{p, q};
                        }
                    }
                    rowSize++;
                    break;
                case "LEFT":
                    for (int i=0; i<colSize; i++) {
                        if (isAvailable(p, --q, rows, cols)) {
                            ret[counter++] = new int[]{p, q};
                        }
                    }
                    colSize++;
                    break;
                case "UP":
                    for (int i=0; i<rowSize; i++) {
                        if (isAvailable(--p, q, rows, cols)) {
                            ret[counter++] = new int[]{p, q};
                        }
                    }
                    rowSize++;
                    break;
            }
            
            directionIndex = (directionIndex+1) % 4;
        }
        
        return ret;
    }
    
    private boolean isAvailable(int p, int q, int maxR, int maxC) {
        if ( (0 <= p && p <= (maxR - 1)) && (0 <= q && q <= (maxC - 1))) {
            return true;
        }  
        
        return false;
    }  
}

풀이 접근 과정

첫번째 문제, 두번째 문제와 유사하지만 조금 더 업그레이드 되었다. 하지만 원리는 똑같다.

다만 해당 인덱스가 허용할만한 것인지 확인하는 과정만 추가되면 된다. 

또 다른 점은 시작점부분인데 미리 초기세팅하면 된다.

 

느낀점

  • 초기세팅이나 출력값이 이전과 달랐지만 기본적인 흐름은 똑같아서 풀기 어렵지 않았다.

알고리즘 정리노트: .leetcode(알고리즘 문제풀이 접근)

반응형