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
'ALGORITHM > c&c++ leetcode' 카테고리의 다른 글
[C++/LeetCode] Convert BST to Greater Tree (0) | 2022.04.16 |
---|---|
[C++/LeetCode] Trim a Binary Search Tree (0) | 2022.04.15 |
[C++/LeetCode] Game of Life (0) | 2022.04.12 |
[C++/LeetCode] Kth Largest Element in a Stream (0) | 2022.04.08 |
[C/LeetCode] Container With Most Water (0) | 2022.04.05 |