0. 문제
https://leetcode.com/problems/reshape-the-matrix/
1. 문제 설명
- 문제에서 이중 배열(mat), 행의 수(r), 열의 수(c)가 주어진다.
- 주어진 이중 배열(mat)을 주어진 행(r)과 열(c)의 형태로 변환하는 것이 문제의 핵심이다.
2. 문제 해설
a) 첫 번째 판단
- 가장 첫 번째로 파악해야 할 것은 주어진 이중 배열(mat)이 주어진 행(r)과 열(c)로 변환이 가능하냐는 것이다.
- 이를 판단하기 위해서 주어진 이중 배열(mat)의 원소 개수를 계산한다.
- 이중 배열의 원소 개수를 파악한 후, r * c를 계산하여 두 결과를 비교한다.
- 두 결과를 비교했을 때 동일한 경우, 변환 가능하다.
- 두 결과를 비교했을 때 원소의 개수가 다른 경우, 변환이 불가하므로 이중 배열(mat)을 그대로 반환한다.
b) 두 번째 판단
- 첫 번째 판단에 부합하는 경우, 이중 배열(mat)을 주어진 행렬로 변환하는 과정을 생각해봐야 한다.
- 우선 결과를 담을 이중 배열 result를 생성한다.
- 이중 배열 result는 문제에서 주어진 행(r)과 열(c)의 길이를 가진다.
c) 세 번째 판단
- 이중 배열(mat)의 원소를 탐색해야 하므로 이중 for문을 구성한다.
- 두 번째 for문에서 각 배열의 원소를 하나씩 탐색할 때마다 result에 순차적으로 원소를 저장한다.
- 두 번째 for문에서 원소를 하나씩 저장할 때마다 result의 column index를 하나씩 증가한다.
- 만약 reuslt의 column index가 주어진 열(c)과 동일해지면 result의 row index를 증가시킨다.
- 다음 코드를 보면서 이해해보자.
3. 정답 코드
class Solution {
public int[][] matrixReshape(int[][] mat, int r, int c) {
int row = mat.length;
int col = mat[0].length;
if(row * col != r * c) {
return mat;
}
int[][] result = new int[r][c];
int resRow = 0;
int resCol = 0;
for(int i = 0; i < row; i ++) {
for (int j = 0; j < col; j++) {
result[resRow][resCol] = mat[i][j];
resCol ++;
if(resCol == c) {
resCol = 0;
resRow++;
}
}
}
return result;
}
}
'Algorithm > 알고리즘 문제풀이' 카테고리의 다른 글
LeetCode 36(Valid Sudoku, java) (0) | 2022.04.13 |
---|---|
LeetCode 118(Pascal's Triangle, java) (0) | 2022.04.13 |
LeetCode 121(Best Time to Buy and Sell Stock, java) (0) | 2022.04.12 |
LeetCode 350(Intersection of Two Arrays 2, java) (0) | 2022.04.12 |
LeetCode 88(Merge Sorted Array, java) (0) | 2022.04.12 |
댓글