새소식

Programmers Coding Test/Java

[프로그래머스 120842] Java - 코딩테스트 입문 / 2차원으로 만들기

  • -

 

 

2차원으로 만들기

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/120842

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

1)  문제

정수 배열 num_list와 정수 n이 매개변수로 주어집니다. 
num_list를 다음 설명과 같이 2차원 배열로 바꿔 return하도록 solution 함수를 완성해주세요.

num_list가 [1, 2, 3, 4, 5, 6, 7, 8] 로 길이가 8이고 
n이 2이므로 num_list를 2 * 4 배열로 다음과 같이 변경합니다. 
2차원으로 바꿀 때에는 num_list의 원소들을 앞에서부터 n개씩 나눠 2차원 배열로 변경합니다.

제한사항
num_list의 길이는 n의 배 수개입니다.
0 ≤ num_list의 길이 ≤ 150
2 ≤ n < num_list의 길이

 

 

 

 

2)  예시

 

 

Result Table
num_list n result
[1, 2, 3, 4, 5, 6, 7, 8] 2 [[1, 2], [3, 4], [5, 6], [7, 8]]
[100, 95, 2, 4, 5, 6, 18, 33, 948] 3 [[100, 95, 2], [4, 5, 6], [18, 33, 948]]

 

 

 

입출력 예 #1
num_list가 [1, 2, 3, 4, 5, 6, 7, 8] 로 길이가 8이고 n이 2이므로 
2 * 4 배열로 변경한 [[1, 2], [3, 4], [5, 6], [7, 8]] 을 return합니다.

입출력 예 #2
num_list가 [100, 95, 2, 4, 5, 6, 18, 33, 948] 로 길이가 9이고 n이 3이므로 3 * 3 배열로 변경한
[[100, 95, 2], [4, 5, 6], [18, 33, 948]] 을 return합니다.

 

 

 

 

 

3)  풀이

 

 

 

 

1. 클래스 선언을 해줍니다

● class Solution {

클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.

 

 

 

 

2. 정수배열 num_list와 정수 n을 매개변수로 하는 solution 메소드를 선언합니다.

solution은2차원 배열을 반환하므로 데이터타입을 int[][]으로 합니다.

●      public int[][] solution(int[] num_list, int n) {

 

 

 

 

3. 제한사항을 검사합니다. 제한사항을 만족하지 않을 경우, 예외처리합니다.

단, 현재 num_list는 n의 배 수개라는 제한사항은 아래쪽 for 반복문 내에서 확인되므로 따로 제한사항으로 검사하지 않았습니다.

     if(num_list.length < 0 || num_list.length > 150 || 2 > n || n > num_list.length){
            throw new IllegalArgumentException("제한사항을 확인하세요");
        }

 

 

 

 

4. ArrayList인 List result를 생성해줍니다. 이 때, 각 원소는 int 배열을 가집니다.

  List<int[]> result = new ArrayList<>();

 

 

 

5. 0부터 시작하여 n값을 점점 더해주어 num_list배열길이만큼 값을 늘려주는 반복문을 실행할 것입니다.

이것은 subArray라는 신규배열을 만들고, 이 배열이 n개의 원소를 가지도록 하기 위함입니다.

즉, 이 반복문이 실행되면 첫째, num_list를 n으로 나눈 수만큼 subArray배열이 생기고

둘째, subArray는 그 안에 n개의 원소를 가지도록 합니다.

   for (int i = 0; i < num_list.length; i += n) {
            int[] subArray = new int[n];

 

 

 

 

 

6. i가 증가하는 반복문 내부에 이중반복문으로 j가 1씩 증가하는 반복문도 시행합니다.

이 때, j의 조건식에서는 n보다 작고, i+j의 값이 num_list의 길이보다 작게 설정합니다.

j는 subArray 내부에 원소를 집어넣기 위함이므로, j가 0부터 시작한다면 n보다 작아야 n개의 갯수가 들어가게 됩니다.

i+j가 num_list의 길이보다 작아야하는 이유는, 배열 원소로 값을 넣어줄 때 num_list에 있는 값을 사용해야하기 때문에 존재하는 인덱스를 사용하기 위함입니다.

 

subArray의 j번째 요소를 대입하여줄 때, num_list의 i+j번째 요소를 찾아넣어주게 되면 n개씩 묶어주었을 때 해당하는 원소의 값을 넣어줄 수 있게 됩니다.

(이부분에서 굉장히 막혔.....다는)

 

그리고 j 반복문이 끝나면 subArray를 result배열에 추가하여줍니다. 

 

그 후 ArrayList인 result를 Array로 형변환 시켜줍니다.

result.toArray(new int[0][])에서 new int[0][]는 결과로 반환되는 배열이 비어있음을 의미합니다. 
즉, result 리스트에 저장된 모든 int[] 배열이 결과로 반환되는 배열의 요소가 됩니다. 
이것은 결과 배열의 크기가 result 리스트의 크기와 같고,
각 요소는 result 리스트의 요소인 int[] 배열들로 채워짐을 의미합니다.

   for (int j = 0; j < n && i + j < num_list.length; j++) {
                subArray[j] = num_list[i + j];
            }
            result.add(subArray);
        }
        return result.toArray(new int[0][]);
    }
}

 

 

 

 

이해를 쉽게 하기 위해 예시를 들어봅시다.

num_list = [1,2,3,4,5,6,7,8,9]

n = 3

 

첫번째 i 반복

i = 0 이고, 3개 정수원소를 가지는 subArray 생성

j가 0일 때, subArray의 0번 인덱스값은 num_list의 0번 인덱스 값과 같으니 subArray[0] = [1]

j가 1일 때, subArray의 1번 인덱스값은 num_list의 1번 인덱스 값과 같으니 subArray[1] = [2]

j가 2일 때, subArray의 2번 인덱스값은 num_list의 2번 인덱스 값과 같으니 subArray[2] = [3]

j는 n(3)미만일 때까지 반복되었으니 j 반복문 종료

subArray를 result 배열에 추가

 

 

두번째 i 반복

i = 3 이고, 3개 정수원소를 가지는 subArray 생성

j가 0일 때, subArray의 0번 인덱스값은 num_list의 3번 인덱스 값과 같으니 subArray[0] = [4]

j가 1일 때, subArray의 1번 인덱스값은 num_list의 4번 인덱스 값과 같으니 subArray[1] = [5]

j가 2일 때, subArray의 2번 인덱스값은 num_list의 5번 인덱스 값과 같으니 subArray[2] = [6]

j는 n(3)미만일 때까지 반복되었으니 j 반복문 종료

subArray를 result 배열에 추가

 

 

 

세번째 i 반복

i = 6 이고, 3개 정수원소를 가지는 subArray 생성

j가 0일 때, subArray의 0번 인덱스값은 num_list의 0번 인덱스 값과 같으니 subArray[0] = [7]

j가 1일 때, subArray의 1번 인덱스값은 num_list의 1번 인덱스 값과 같으니 subArray[1] = [8]

j가 2일 때, subArray의 2번 인덱스값은 num_list의 2번 인덱스 값과 같으니 subArray[2] = [9]

j는 n(3)미만일 때까지 반복되었으니 j 반복문 종료

subArray를 result 배열에 추가

i는 이제 더이상 반복되지 않으므로 result 배열을 리턴해줌

 

 

 

 

 

4)  코드

 

import java.util.ArrayList;
import java.util.List;

class Solution {
    public int[][] solution(int[] num_list, int n) {
        
        if(num_list.length < 0 || num_list.length > 150 || 2 > n || n > num_list.length){
            throw new IllegalArgumentException("제한사항을 확인하세요");
        }

        List<int[]> result = new ArrayList<>();
        
        for (int i = 0; i < num_list.length; i += n) {
            int[] subArray = new int[n];
            for (int j = 0; j < n && i + j < num_list.length; j++) {
                subArray[j] = num_list[i + j];
            }
            result.add(subArray);
        }
        return result.toArray(new int[0][]);
    }
}

 

 

\

 

 

 

 

5)  느낀점

이차원배열의 빈배열 생성, 행과 열에 대해 자세히 공부할 수 있었던 문제였습니다.

다만, ArrayList로 생성된 동적 배열을 Array인 정적 배열로 형변환할 때 어떤식으로 해주어야할지 메소드 자체에 혼동이 있어 해결하는데 어려움이 있었습니다.

유튜브, 구글링을 통해 이차원배열에 대해 공부를 한 후에 해결할 수 있었습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.