지난 포스팅에서 자바의 배열에 대해서 다뤘습니다.
이번 포스팅에선 배열의 연장선인 2차원 배열에 대해서 다루고자 합니다.
2차원이라고 해서 복잡하게 생각이 들 수도 있는데, 크게 어렵지 않습니다.
2차원 배열이란
자료형이 같은 1차원 배열의 묶음으로 배열 안에 다른 배열 존재로,
2차원 배열은 할당된 공간마다 인덱스 번호 두 개 부여합니다.
(앞 번호는 행, 뒷 번호는 열 ([0][0]) )
그림으로 보면 위와 같습니다.
일반적인 행 열 이라고 생각하시면 편합니다.
맨 처음 시작하는 원소의 인덱스 값은 a[0][0] 입니다.
배열처럼 행이나 열 모두 0부터 시작한다고 가정합니다.
2차원 배열의 선언과 할당입니다.
1차원 배열과 크게 다를 거 없이 인덱스 저장이 하나 더 추가된 겁니다.
배열의 구조입니다.
기존 배열과 크게 다를 것은 없지만, 한 가지 주시해야 하는 것이 있습니다.
2차원 배열의 각 인덱스(행)의 주소가 다른 걸 볼 수 있습니다.
이 부분만 숙지하고 있으면 됩니다.
2차원 배열의 원소 값을 초기화하는 방법은 위와 같이 다양합니다.
기존의 1차원 배열과 비슷한 방법이긴 하나,
각 행에 접근하여 , 또 행의 원소마다 접근해야 하니 이중 for문이 자주 쓰입니다.
그럼 2차원 배열의 예제를 살펴봅시다.
2차원 배열 예제
난이도 ★★☆
예제 1
Q : 다음의 정수 배열이 있다.
37, 92, 58, 46, 94, 29, 25, 58
위 배열에서 짝수에 해당하는 값과 홀수에 해당하는 값을 별도의 짝수 값만 저장하는 짝수 배열
홀수 값만 저장하는 홀수 배열로 분리하여 저장하도록 한다.
public static void ex1() {
int arr[] = new int[] {37, 92, 58, 46, 94, 29, 25, 58};
int odd[] = new int[0];
int even[] = new int[0];
for(int i=0; i<arr.length; i++) {
if(arr[i] % 2 == 0) {
int evenCopy[] = new int[even.length + 1];
System.arraycopy(even, 0, evenCopy, 0, even.length);
even = evenCopy;
even[even.length - 1] = arr[i];
}else {
int oddCopy[] = new int[odd.length + 1];
System.arraycopy(odd, 0, oddCopy, 0, odd.length);
odd = oddCopy;
odd[odd.length - 1] = arr[i];
}
}
System.out.println(Arrays.toString(even));
System.out.println(Arrays.toString(odd));
}
public static void main(String[] args) {
ex1();
}
난이도 ★★
예제 2
Q : 다음의 정수 배열이 있다.
37, 92, 58, 46, 94, 29, 25, 58
위 배열에서 가장 큰 값과 가장 작은 값만을 분리하여 별도의 배열에 저장하도록 한다.
public static void ex1() {
int arr[] = new int[] {37, 92, 58, 46, 94, 29, 25, 58};
int max = arr[0];
int min = arr[0];
for(int i=0; i<arr.length; i++) {
if(arr[i] > max) max = arr[i];
if(arr[i] < min) min = arr[i];
}
int num[] = {max,min};
System.out.println(Arrays.toString(num));
}
public static void main(String[] args) {
ex1();
}
난이도 ★★★
예제 3
Q : 다음의 정수 배열이 있다.
37, 92, 58, 46, 94, 29, 25, 58
위 배열에서 짝수에 해당하는 값과 홀수에 해당하는 값을 별도의 짝수 값만 저장하는 짝수 배열
홀수 값만 저장하는 홀수 배열로 분리하여 저장하도록 한다.(정적 배열)
public static void ex1() {
int[] arr = new int[] {7,92,58,46,94,29,25,58};
int[][] arrEvenOdd = new int[2][8];
int evenCount=0, oddCount=0;
for(int i=0; i<arr.length; i++) {
if(arr[i] % 2 ==0) {
arrEvenOdd[0][evenCount++] = arr[i];
}else {
arrEvenOdd[1][oddCount++] = arr[i];
}
}
for(int i=0; i<arrEvenOdd.length; i++) {
System.out.println(Arrays.toString(arrEvenOdd[i]));
}
}
public static void main(String[] args) {
ex1();
}
난이도 ★★★★
예제 4
Q : 다음의 정수 배열이 있다.
37, 92, 58, 46, 94, 29, 25, 58
위 배열에서 가장 큰 값과 가장 작은 값만을 분리하여 별도의 배열에 저장하도록 한다.
(2차원 배열 형식)
public static void ex1() {
int[] arr = new int[] {7,92,58,46,94,29,25,58};
int[][] arrEvenOdd = new int[2][];
// arrEvenOdd[0] : 짝수 저장
// arrEvenOdd[1] : 홀수 저장
int arrEven[] = new int[0];
int arrOdd[] = new int[0];
for(int i=0; i<arr.length; i++) {
if(arr[i] % 2 ==0) {
int arrEvenCopy[] = new int[arrEven.length + 1];
System.arraycopy(arrEven, 0, arrEvenCopy, 0, arrEven.length);
arrEven = arrEvenCopy;
arrEven[arrEven.length - 1] = arr[i];
}else {
int arrOddCopy[] = new int[arrOdd.length + 1];
System.arraycopy(arrOdd, 0, arrOddCopy, 0, arrOdd.length);
arrOdd = arrOddCopy;
arrOdd[arrOdd.length - 1] = arr[i];
}
}
arrEvenOdd[0] = arrEven;
arrEvenOdd[1] = arrOdd;
System.out.println(Arrays.deepToString(arrEvenOdd));
}
public static void main(String[] args) {
ex1();
}
이상 java의 2차원 배열을 마치겠습니다.