본문 바로가기

문제 풀이

정사각형으로 만들기 - Programmers

프로그래밍을 하다 보면 문제 자체보다도 그 문제를 해결해 나가는 과정에서 더 많은 것을 배우는 경우가 많습니다. 이번 포스팅에서는 제가 직접 겪었던 시행착오를 공유하고자 합니다.

문제는 다음과 같았습니다.


📌 문제 설명

정수형 2차원 배열 arr이 주어질 때,

  • 행(row)의 수가 더 많다면: 각 행의 끝에 0을 추가하여 열(column)의 수를 행 수와 같게 만든다.
  • 열(column)의 수가 더 많다면: 행을 추가하여 행의 수를 열 수와 같게 만든다.
  • 결과적으로, 정사각형 형태의 2차원 배열로 만들어 반환하는 문제입니다.

예를 들어,

arr = {
    {1, 2, 3},
    {4, 5, 6}
}

는 행이 2, 열이 3이므로 행을 하나 더 추가하여 아래와 같은 형태로 만들어야 합니다.

result = {
    {1, 2, 3},
    {4, 5, 6},
    {0, 0, 0}
}

❌ 저의 첫 번째 시도

처음에 저는 이렇게 접근했습니다.

class Solution {
    public int[][] solution(int[][] arr) {
        int rowCount = arr[0].length;
        int columnCount = arr.length;

        if (rowCount == columnCount) {
            return arr;
        } else if (rowCount > columnCount) {
            int[][] answer = new int[rowCount][rowCount];
            for (int i = 0; i < arr.length; i++) {
                answer[i] = new int[arr[i].length];
                System.arraycopy(arr[i], 0, answer[i], 0, arr[i].length);
            }
            return answer;
        } else {
            int[][] answer = new int[columnCount][columnCount];
            for (int i = 0; i < arr.length; i++) {
                answer[i] = new int[arr[i].length];
                System.arraycopy(arr[i], 0, answer[i], 0, arr[i].length);
            }
            return answer;
        }
    }
}

처음엔 그럴듯해 보였지만, 실행해보니 이상한 결과가 나왔습니다.


❗ 문제의 핵심 원인

결정적인 문제는 바로 행과 열의 수를 혼동했다는 점이었습니다.

int rowCount = arr[0].length;
int columnCount = arr.length;
 

위 코드는 실제로는 반대입니다.

  • arr.length는 행(row)의 수
  • arr[0].length는 열(column)의 수

즉, 아래와 같이 바꿔야 올바릅니다.

int rowCount = arr.length;
int colCount = arr[0].length;
 

또한, 배열을 복사할 때 answer[i] = new int[arr[i].length]; 처럼 행마다 배열을 새로 만들었지만, 이미 answer 배열을 정사각형으로 선언했기 때문에 불필요한 중복 코드였습니다.


✅ 수정한 코드

이후, 문제의 요구사항을 다시 정리하고 간단하게 정사각형 배열을 선언한 뒤 기존 데이터를 복사하는 방식으로 리팩토링했습니다.

class Solution {
    public int[][] solution(int[][] arr) {
        int rowCount = arr.length;
        int colCount = arr[0].length;

        int max = Math.max(rowCount, colCount);
        int[][] answer = new int[max][max]; // 정사각형 배열 생성

        for (int i = 0; i < rowCount; i++) {
            for (int j = 0; j < colCount; j++) {
                answer[i][j] = arr[i][j];
            }
        }

        return answer;
    }
}
 

간결하고, 유지보수하기도 좋으며, 가독성도 훨씬 좋아졌습니다.


✍️ 배운 점

  1. 문제의 개념을 정확히 이해하는 것의 중요성
  2. 불필요한 조건 분기보다 단순하고 명확한 코드가 더 효율적일 수 있다는 점
  3. 문제를 풀다가 틀렸을 때, 코드의 흐름을 천천히 따라가며 잘못된 논리를 직접 짚어보는 경험이 얼마나 값진지 다시 느꼈습니다.