본문 바로가기
Algorithm/알고리즘 문제풀이

LeetCode 566(Reshape the Matrix, java)

by devraphy 2022. 4. 13.

0. 문제

https://leetcode.com/problems/reshape-the-matrix/

 

Reshape the Matrix - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

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;
    }
}

댓글