# Spiral Matrix

Given an m x n matrix, return all elements of the matrix in spiral order.

Example 1 :

| 1 | 2 | 3 |
| - | - | - |
| 4 | 5 | 6 |
| 7 | 8 | 9 |

Input : matrix = \[\[1,2,3],\[4,5,6]\[7,8,9]]\
Output : \[1,2,3,6,9,8,7,4,5]

Example 2 :

| 1 | 2  | 3  | 4  |
| - | -- | -- | -- |
| 5 | 6  | 7  | 8  |
| 9 | 10 | 11 | 12 |

Input : matrix = \[\[1,2,3,4],\[5,6,7,8]\[9,10,11,12]]\
Output : \[1,2,3,4,8,12,11,10,9,5,6,7,8]

**자료구조** : List와 변수 4개 이용(rowStart,rowEnd,colStart,colEnd)\
**알고리즘**\
1\. 행과 열이 어떻게 변화하는지 본다.\
2\. 행과 열이 바뀔 때마다 그다음 증감식의 범위가 바뀌기 때문에 이 범위를 체크하기 위해 rowStart,rowEnd,colStart,colEnd를 이용한다!

**알고리즘을 java로 구현**

```java
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        //1. 그릇 생성
        int rowStart = 0,colStart = 0;
        int rowEnd = matrix.length-1;//3-1=2.
        int colEnd = matrix[0].length-1;//4-1=3.
        List<Integer> result = new ArrayList<>();
        if(matrix == null || matrix.length == 0) return result;
        
        while(rowStart <= rowEnd && colStart <= colEnd) {
            //right. 행고정, 열증가
            for(int i=colStart; i <= colEnd; i++) {
                result.add(matrix[rowStart][i]);
            }
            rowStart++;
            //down. 열고정, 행증가
            for(int i=rowStart; i <= rowEnd; i++) {
                result.add(matrix[i][colEnd]);
            }
            colEnd--;
            //left. 행고정, 열감소!
            if(rowStart <= rowEnd) {
                for(int i=colEnd; i >= colStart ;i--) {
                    result.add(matrix[rowEnd][i]);
                }
            }
            rowEnd--;//rowStart < rowEnd!!!
            //up. 열고정, 행감소!
            if(colStart <= colEnd) {
                if(rowStart <= rowEnd) {
                    for(int i = rowEnd; i >= rowStart; i--) {
                        result.add(matrix[i][colStart]);
                    }
                }
            }
            colStart++;//colStart < colEnd!!!
            // //2nd right. 행고정, 열증가!
            // for(int i= colStart; i <= colEnd ; i++) {
            //     result.add(matrix[rowStart][i]);
            // }
      }  
        return result;
    }
}
```
