이차원 정수 배열 arr이 매개변수로 주어집니다. arr의 행의 수가 더 많다면 열의 수가 행의 수와 같아지도록 각 행의 끝에 0을 추가하고, 열의 수가 더 많다면 행의 수가 열의 수와 같아지도록 각 열의 끝에 0을 추가한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
우선 문제와 입출력 예제에 따라 if문으로 조건 3가지를 나누었다. 이때, arr의 모든 원소의 길이는 동일하므로 arr.length > arr[0].length와 같이 0번 인덱스의 길이와 전체 배열의 길이를 비교했다.
1. 행의 길이 > 열의 길이
※ 전체 길이 = 행의 길이, 원소인 1차원 배열의 길이 = 열의 길이
행의 길이는 arr과 동일하도록 answer = new int[arr.length][]; 배열을 초기화한다.
다음으로는 for문으로 루프를 돌며 answer[i]에 Arrays.copyOf(원본 배열, 복사할 길이)로 arr[i]의 값들을 복사한다.
중요한 건 복사할 길이가 arr[i].length가 아닌 arr.length의 길이라는 점이다. 정수형 배열이기 때문에 arr[i]에 존재하지 않는 값들은 0으로 초기화되는 특징을 이용했다.
2. 행의 길이 < 열의 길이
전체 길이가 열의 길이 만큼 늘어나야 하므로 answer = new int[arr[0].length][arr[0].length]로 배열을 초기화한다.
그리고 for문으로 루프를 돌며 System.arraycopy(원본 배열, 원본 시작 위치, 새 배열, 새 배열 시작 위치)로 2차원 배열 깊은 복사를 해주었다.
arr.length 만큼 루프를 돌기 때문에 arr[i]의 값들이 해당 길이 만큼 복사되는 과정에서, (역시나 정수형 배열이기 때문에) 길이보다 부족한 값들은 0으로 초기화되는 특징을 이용했다.
3. 행의 길이 = 열의 길이
int[][] arr을 그대로 반환하면 되므로 얕은 복사(=)를 이용해 answer에 값을 저장해 주었다.
import java.util.Arrays;
class Solution {
public int[][] solution(int[][] arr) {
int[][] answer = {};
if(arr.length > arr[0].length){
answer = new int[arr.length][];
for(int i=0; i<arr.length; i++){
answer[i] = Arrays.copyOf(arr[i], arr.length);
}
}else if(arr.length < arr[0].length){
answer = new int[arr[0].length][arr[0].length];
for(int i=0; i<arr.length; i++){
System.arraycopy(arr[i], 0, answer[i], 0, answer[i].length);
}
}else{
answer = arr;
}
return answer;
}
}
