[프로그래머스 120842] Java - 코딩테스트 입문 / 2차원으로 만들기
- -
2차원으로 만들기
https://school.programmers.co.kr/learn/courses/30/lessons/120842
1) 문제
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) 예시
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인 정적 배열로 형변환할 때 어떤식으로 해주어야할지 메소드 자체에 혼동이 있어 해결하는데 어려움이 있었습니다.
유튜브, 구글링을 통해 이차원배열에 대해 공부를 한 후에 해결할 수 있었습니다.
'Programmers Coding Test > Java' 카테고리의 다른 글
[프로그래머스 120844] Java - 코딩테스트 입문 / 배열 회전시키기 (0) | 2024.02.16 |
---|---|
[프로그래머스 120843] Java - 코딩테스트 입문 / 공 던지기 (0) | 2024.02.16 |
[프로그래머스 120840] Java - 코딩테스트 입문 / 구슬을 나누는 경우의 수 (0) | 2024.02.13 |
[프로그래머스 120839] Java - 코딩테스트 입문 / 가위 바위 보 (0) | 2024.02.08 |
[프로그래머스 120838] Java - 코딩테스트 입문 / 모스부호 (1) (2) | 2024.02.08 |
소중한 공감 감사합니다