늦은 프로그래밍 이야기

자바 알고리즘 (2차원 배열) 본문

내일배움캠프/자료구조 알고리즘

자바 알고리즘 (2차원 배열)

한정규 2022. 12. 6. 21:08

2차원 배열 만들기

논점

 - 1차원 배열에 있는 숫자 데이터를 2차원 배열로 옮긴다.

 

2차원 배열 만드는 방법

배열의 선언과 초기화를 동시에 하는 법

 - 기본 값으로 0이 들어가게 된다.

int[][] arr = new int[i][j];

 - 기본 값을 정해준다.

int[][] arr = {{1, 2, 3}, {4, 5, 6}};

 

리스트로 만드는 방법

 - 리스트 안에 리스트 추가

List<List<Integer>> arr = new ArrayList<>();

for (int i = 0; i < 3; i++) {
    arr.add(new ArrayList<>());
}
// []
// []
// []

 - 리스트 요소의 크키 및 초기 값 설정 (Collection.nCopies(size, value))

List<List<Integer>> arr = new ArrayList<>();

for (int i = 0; i < 3; i++) {
    arr.add(Collection.nCopies(3, 0));
}
// [0, 0, 0]
// [0, 0, 0]
// [0, 0, 0]

 - 초기 값이 각각 다른 리스트 (Arrays.asList())

List<List<Integer>> arr = Arrays.asList(
    Arrays.asList(1, 2, 3),
    Arrays.asList(4, 5, 6),
    Arrays.asList(7, 8, 9)
);
// [1, 2, 3]
// [4, 5, 6]
// [7, 8, 9]

문제

정수 배열 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차원 배열로 변경합니다.

 

해결

 - 1차 인덱스를 나열할 반복문이 필요.

 - 2차 인덱스를 나열할 반복문이 필요.

 - 기존 배열의 인덱스를 나열할 방법이 필요했다. count 변수를 사용하는 방법이 있지만 막상 떠오르지 않았고 문제를 다 풀고 나서야 다른 사람들의 풀이 방법을 보고 알게 되었다. 그래서 가지고 있는 i와 j로 조합하여 사용하다가 더이상 안되어서 n을 사용하여 조합해보았다.

 - 2차원 배열은 배열로 만드는 방법 밖에 몰라서 배열로 풀었지만, 리스트로 만드는 방법도 시도해보았다.

배열로 만드는 방법

class Solution {
    public int[][] solution(int[] num_list, int n) {
        int[][] answer = new int[num_list.length/n][n]; // 2차원 배열을 주어진 배열을 n만큼 쪼갠 수와 n의 길이로 선언
        for (int i = 0; i < num_list.length/n; i++) {  // 1차 인덱스를 나열
            for (int j = 0; j < n; j++) {              // 2차 인덱스를 나열
                answer[i][j] = num_list[i * n + j];    // i가 0인 경우에는 0, 1, 2 i가 1인 경우에는 n, n+1, n+2 ...
            }
        }
        return answer;
    }
}

 

리스트로 만드는 방법

import java.util.*;

class Solution {
    public List solution(int[] num_list, int n) {
        List<List<Integer>> answer = new ArrayList<>(); // answer 리스트 안에 리스트 생성
        int count = 0;
        for (int i = 0; i < num_list.length/n; i++) {   // answer 리스트의 인덱스
            List<Integer> arr = new ArrayList<>();      // arr 리스트 생성
            for (int j = 0; j < n; j++) {               // arr 리스트의 인덱스
                arr.add(num_list[count]);               // arr 리스트에 추가
                count += 1;
            }
            answer.add(arr);  // answer 리스트에 arr 리스트 추가
        }
        return answer;
    }
}

Comments