다중 배열 [ ] [ ]
동일한 타입의 데이터 여러 개를 묶어 관리하기 위해 사용
ex)
자료형[][] multiArray = new 자료형[행][열];
int[][] multiArr = new int[2][4];
for (int i = 0; i < multiArr.length; i++) {
for (int j = 0; j < multiArr[i].length; j++) {
System.out.print(multiArr[i][j] + " ");
}
System.out.println(" ");
}
System.out.println(Arrays.toString(multiArr)); //주소값 출력
for (int i = 0; i < multiArr.length; i++) {
System.out.println(Arrays.toString(multiArr[i])); //multiarr01의 i행의 값 출력
}
System.out.println("==========");
for (int[] is : multiArr) {
System.out.println(Arrays.toString(is)); //forEach 사용
}
[실행결과]
0 0 0 0
0 0 0 0
[[I@7637f22, [I@4926097b]
[0, 0, 0, 0]
[0, 0, 0, 0]
==========
[0, 0, 0, 0]
[0, 0, 0, 0]
예제 1.
<값 대입하기>
int[][] multiArr = new int[2][4];
for (int i = 0; i < multiArr.length; i++) { //2번 반복
for (int j = 0; j < multiArr[i].length; j++) { //4번 반복
multiArr[i][j] = (i * 4) + j + 1;
}
System.out.println(Arrays.toString(multiArr[i]));
}
[실행결과]
[1, 2, 3, 4]
[5, 6, 7, 8]
예제 2.
<array와 multiArray, forEach 출력 비교>
- 1 ~ 12까지의 정수를 대입
- multiArray는 3행 4열의 배열로 선언
int[] arr = new int[12];
int[][] multiArr = new int[3][4];
int num = 1;
int num2 = 1;
for (int i = 0; i < arr.length; i++) {
arr[i] = num++;
}
System.out.println(Arrays.toString(arr)); //① 1 ~ 12 까지의 값 출력
for (int i = 0; i < multiArr.length; i++) {
for (int j = 0; j < multiArr[i].length; j++) {
multiArr[i][j] = num2++;
}
System.out.println(Arrays.toString(multiArr[i])); //② 3행 4열의 1 ~ 12 까지의 값 출력
}
for (int[] is : multiArr) {
System.out.print(Arrays.toString(is)); //③ 1 ~ 12 까지의 값 출력
}
System.out.println("");
for (int[] is : multiArr) {
for (int i : is) { //이중배열이기 때문에 forEach 두번 사용
System.out.print(i + " "); //④ 1 ~ 12 까지의 값 출력
}
}
[실행결과]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]
[1, 2, 3, 4][5, 6, 7, 8][9, 10, 11, 12]
1 2 3 4 5 6 7 8 9 10 11 12
예제 3.
<피보나치 수열>
- 1부터 시작하는 길이가 22인 피보나치 수열 만들기
- 1, 2는 기본으로 주어진다.
int[] num = new int[22];
num[0] = 1;
num[1] = 2;
for (int i = 2; i < num.length; i++) {
num[i] = num[i - 2] + num[i - 1];
}
System.out.println(Arrays.toString(num));
[실행결과]
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657]
예제 4.
<국어, 수학, 영어 시험의 총점, 평균, 등급 구하기>
- 학생의 수와 이름 입력받기
- MultiArray, switch, for, if 사용
Scanner sc = new Scanner(System.in);
System.out.print("학생 수를 입력하세요. : ");
int input = sc.nextInt();
int[][] student = new int[input][4];
String[] name = new String[input];
String[] subject = {"korean", "math", "english"};
char[] grade = new char[input];
double[] avg = new double[input];
for (int i = 0; i < name.length; i++) {
System.out.print("이름을 입력하세요. : ");
name[i] = sc.next();
for (int j = 0; j < subject.length; j++) {
do {
System.out.println(subject[j] + "점수를 입력하세요. : ");
student[i][j] = sc.nextInt();
} while (student[i][j] < 0 || student[i][j] > 100);
}
student[i][3] = student[i][0] + student[i][1] + student[i][2]; //총점
avg[i] = student[i][3] / 3.0; //평균
switch ((int) (avg[i] / 10)) { //등급
case 10:
case 9:
grade[i] = 'A';
break;
case 8:
grade[i] = 'B';
break;
case 7:
grade[i] = 'C';
break;
case 6:
grade[i] = 'D';
break;
default:
grade[i] = 'F';
break;
}
}
System.out.println("┏━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┓");
System.out.println("┃ 이름 ┃ 국어 ┃ 수학 ┃ 영어 ┃ 총점 ┃ 평균 ┃ 등급 ┃");
System.out.println("┣━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━┫");
for (int i = 0; i < name.length; i++) {
System.out.printf ("┃%3.2s ┃ %3d ┃ %3d ┃ %3d ┃ %3d ┃ %.2f┃ %2c ┃\n", //① printf
name[i], student[i][0], student[i][1], student[i][2], student[i][3],avg[i], grade[i]);
}
System.out.println("┗━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┛");
- ①
%d : 정수형 (double)
%f : 실수형 (float)
%c : 문자형 (char)
%s3.2 : 3칸 할당 2개만 표시하고 나머지는 삭제 ex) 홍길동 이면 홍길
%.2f : 소수점 아래 2자리 ex) 60.123이면 60.12
%4d : 4칸 할당해서 찍음 ex) 600이면 _600
%S : 모두 대문자처리
[실행결과]
학생 수를 입력하세요. : 3
이름을 입력하세요. : 철수
korean점수를 입력하세요. :
98
math점수를 입력하세요. :
97
english점수를 입력하세요. :
100
이름을 입력하세요. : 영희
korean점수를 입력하세요. :
80
math점수를 입력하세요. :
88
english점수를 입력하세요. :
85
이름을 입력하세요. : 민수
korean점수를 입력하세요. :
74
math점수를 입력하세요. :
60
english점수를 입력하세요. :
88
예제 5.
<무작위 배열>
- 중복되는 수 없이 3 x 3인 배열 만들기
ex) [9, 7, 3]
[5, 1, 4]
[8, 2, 6]
int[][] three = new int [3][3]; //초기값 = 0
for (int i = 1; i < 10; i++) { //숫자 1 ~ 9
int r1 = (int) (Math.random() * 3); //index 0, 1, 2
int r2 = (int) (Math.random() * 3); //index 0, 1, 2
if (three[r1][r2] == 0) {
three[r1][r2] = i;
}else {
i--;
}
}
for (int[] is : three) {
System.out.println(Arrays.toString(is));
}
[실행결과]
[5, 9, 3]
[2, 6, 4]
[7, 8, 1]
예제 5 - 1.
<무작위 배열>
int[][] what = new int[3][3];
for (int i = 0; i < what.length; i++) {
for (int j = 0; j < what[i].length; j++) {
int random = (int) (Math.random() * 9 + 1);
boolean ch = true;
F: for (int k = 0; k < what.length; k++) {
for (int k2 = 0; k2 < what[i].length; k2++) {
if (what[k][k2] != 0 && random == what[k][k2]) {
j--;
ch = false;
break F;
}
}
}
if(ch) what[i][j] = random; //ch가 true 일 때
}
}
for (int[] js : what) {
System.out.println(Arrays.toString(js));
}
[실행결과]
[7, 4, 5]
[8, 9, 2]
[6, 3, 1]