[프로그래머스/Java] Lv.0 정사각형으로 만들기

febCho·2024년 3월 22일
0

코딩테스트

목록 보기
122/253
post-thumbnail

문제

이차원 정수 배열 arr이 매개변수로 주어집니다. arr의 행의 수가 더 많다면 열의 수가 행의 수와 같아지도록 각 행의 끝에 0을 추가하고, 열의 수가 더 많다면 행의 수가 열의 수와 같아지도록 각 열의 끝에 0을 추가한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.

- 제한사항

  • 1 ≤ arr의 길이 ≤ 100
  • 1 ≤ arr의 원소의 길이 ≤ 100
  • arr의 모든 원소의 길이는 같습니다.
  • 1 ≤ arr의 원소의 원소 ≤ 1,000

풀이

우선 문제와 입출력 예제에 따라 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;
    }
}

결과

profile
Done is better than perfect.

0개의 댓글