프로그래밍을 하다 보면 문제 자체보다도 그 문제를 해결해 나가는 과정에서 더 많은 것을 배우는 경우가 많습니다. 이번 포스팅에서는 제가 직접 겪었던 시행착오를 공유하고자 합니다.
문제는 다음과 같았습니다.
📌 문제 설명
정수형 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;
}
}
간결하고, 유지보수하기도 좋으며, 가독성도 훨씬 좋아졌습니다.
✍️ 배운 점
- 문제의 개념을 정확히 이해하는 것의 중요성
- 불필요한 조건 분기보다 단순하고 명확한 코드가 더 효율적일 수 있다는 점
- 문제를 풀다가 틀렸을 때, 코드의 흐름을 천천히 따라가며 잘못된 논리를 직접 짚어보는 경험이 얼마나 값진지 다시 느꼈습니다.
'문제 풀이' 카테고리의 다른 글
| 정수를 나선형으로 배치하기 - Programmers (1) | 2025.06.13 |
|---|---|
| [Java] 조건에 맞게 수열 변환하기 3 - Programmers (0) | 2025.06.13 |
| 프로그래머스 배열만들기 2 (0) | 2024.11.13 |