본문 바로가기

ALGORITHM/c&c++ leetcode

[C++/LeetCode] Spiral Matrix II

Daily LeetCoding Challenge for April, Day 13.

 

문제

이런 형태로 회전되어 숫자가 배치된 2차원 배열을 생성하는 것이다.

 

 

아이디어

방향을 전환하는 key를 만들어서 row, col index에 추가하면서 값을 채우자

이때 방향은 총 4개이다. (◀️🔼▶️🔽)

방향을 전환하는 조건은 row, col이 각각 0, n-1이 되는 경우이다. 즉 2차원 배열의 모서리에서 전환한다.

예외 사항

위 설명에도 있듯이, 꼭 2차원 배열의 모서리가 아니더라도 배열에 값이 채워져있는 경우에도 방향 전환이 필요하다.

따라서 이 예외 처리를 위해서 result 배열을 0으로 초기화하고, 0이 아닌 경우 즉 값이 있는 경우에도 방향을 전환하도록 구현한다.

 

완성

submission: 0ms / 6.7MB

 

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
    	// 0으로 초기화된 2차원 배열을 생성한다.
        vector<vector<int>> result(n, vector<int>(n, 0));
        int row = 0;
        int col = 0;
        
        // 방향 전환 키
        int rowDir = 0;
        int colDir = 1;
        
        for(int i = 1;i <= n * n;i++) {
            result[row][col] = i;
            
            // 방향을 전환하기 전에 이 방향으로 진행해도 될지 미리 테스트를 한다.
            int rowTemp = row + rowDir;
            int colTemp = col + colDir;
            
            // 방향을 전환하는 조건들
            if (rowTemp < 0 || colTemp < 0 || rowTemp == n
            	|| colTemp == n || result[rowTemp][colTemp] != 0)
            {
                // left -> right
                if (rowDir == 0 && colDir == 1) {
                    rowDir = 1;
                    colDir = 0;
                }
                
                // up -> down
                else if (rowDir == 1 && colDir == 0) {
                    rowDir = 0;
                    colDir = -1;
                }
                
                // down -> up
                else if (rowDir == -1 && colDir == 0) {
                    rowDir = 0;
                    colDir = 1;
                }
                
                // right -> left
                else if (rowDir == 0 && colDir == -1) {
                    rowDir = -1;
                    colDir = 0;
                    
                }
            }
            row += rowDir;
            col += colDir;
        }
        
        return result;
    }
};

 

방향을 전환하는 조건에 걸려서 if 문에 들어왔다면 현재 방향을 보고 어떤 방향으로 바꿔야할지 결정한다.

즉 다음과 같은 조건이 적용된다.

 

▶️(left -> right) : 오른쪽으로 진행이 불가하니 밑으로 진행한다. 즉 rowdir = 1, colDir = 0 

◀️(right -> left): 왼쪽으로 진행이 불가하니 위로 진행한다. 즉 rowDir = -1, colDir = 0

🔼(down -> up): 위로 진행이 불가하니 왼쪽으로 진행한다. 즉 rowDir = 0, colDir = 1

🔽(up -> down): 아래로 진행이 불가하니 오른쪽으로 진행한다. 즉 rowDir = 0, colDir = -1