이차원 배열
Integer.parseInt(args[0]);
문자열을 숫자로 변경.
일차원 배열 특징과 이차항 배열
일차원 배열은 배열기호를 쓰고요
이차원은 배열기호 2개
2차원 배열은 : 1차원 배열의 집합
1차원 배열 : 데이터의 집합
package arrays2;
public class Arrays2Test02 {
public static void main(String[] args) {
int arr[][]= {{1,2,3},{4,5,6}};
//2차원 배열의 1차원배열의 집합
//2차원배열 자동으로 만들어주는것
//arr[0], arr[1] : 1차원배열이름
//arr[0][0], arr[0][1], arr[0][2]
System.out.println(arr[0][0]);
System.out.println(arr[0][1]);
System.out.println(arr[0][2]);
System.out.println(arr[1][0]);
System.out.println(arr[1][1]);
System.out.println(arr[1][2]);
}
}
실행 결과
1
2
3
4
5
6
for 문을 사용하여 더 간결하게 바꿀 수 있습니다,
int arr[][]= {{1,2,3},{4,5,6}};
//2차원 배열의 1차원배열의 집합
//2차원배열 자동으로 만들어주는것
//arr[0], arr[1] : 1차원배열이름
//arr[0][0], arr[0][1], arr[0][2]
//arr[1][0], arr[1][1], arr[1][2]
System.out.println("size : "+arr[0].length);
for(int j=0;j<arr[0].length; j++) {
System.out.println(arr[0][j]);
}
System.out.println();
System.out.println(arr[1][0]);
System.out.println(arr[1][1]);
System.out.println(arr[1][2]);
실행결과
size : 3
1
2
3
4
5
6
아래애도 바꿔볼까요? 사이즈도 알아보죠
int arr[][]= {{1,2,3},{4,5,6}};
//2차원 배열의 1차원배열의 집합
//2차원배열 자동으로 만들어주는것
//arr[0], arr[1] : 1차원배열이름
//arr[0][0], arr[0][1], arr[0][2]
//arr[1][0], arr[1][1], arr[1][2]
System.out.println("size : "+arr[0].length);
for(int j=0;j<arr[0].length; j++) {
System.out.print(arr[0][j]);
}
System.out.println();
System.out.println("size : "+arr[1].length);
for(int j=0; j<arr[1].length; j++) {
System.out.print(arr[1][j]+ " ");
}
실행결과
size : 3
123
size : 3
4 5 6
ln이 아닌 그냥 print를 써서 그런거에요.
앗 그런데 두개가 중복되는군요. 그러니 for문을 사용하여 다시 써보도록 하겠습니다.
System.out.println("2arrSize : "+arr[0].length);
for(int i=0; i<2; i++) {
for(int j=0;j<arr[i].length; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
실행결과
2arrSize : 3
1 2 3
4 5 6
2차원배열이름.length:1차원배열의 개수
이제부터는 계속 예제를 통해 2차원배열을 응용해보도록 하겠습니다.
package arrays2;
public class ArraysTest03 {
public static void main(String[] args) {
int arr[][]= {{1,2,3},{4,5,6,7},{8,9}};
//서로 짝이 안 맞음. 행은 3개로 고정하고 열개수는 미정으로 남겨두는거 가능. 가변배열 처리
//int arr3[][]=new int[3][]; //가변 배열 처리
int arr2[][]=new int[5][];
System.out.println("arr-size : "+arr.length);
System.out.println("arr2-size : "+arr2.length);
}
}
실행결과
arr-size : 3
arr2-size : 5
-가변배열에 대해서 알 수 있었습니다.
다음!
int arr[][]= {{1,2,3},{4,5,6,7},{8,9}};
//arr[0],arr[1],arr[2]
int arr2[][]=new int[5][];
System.out.println("arr-size : "+arr.length);
System.out.println(arr[0].length); //열의 개수 세기
System.out.println(arr[1].length);
System.out.println(arr[2].length);
실행 결과
arr-size : 3
3
4
2
열은 가변적으로 쓸 수있기 대문에 생략이 가능하지만, 행은 무조건 고정시켜놓아야합니다.
package arrays2;
public class Arrays3Test04 {
public static void main(String[] args) {
int[][] ar=new int[3][3];
for(int i=0; i<3; i++) {//rows 행
for(int j=0; j<3; j++) {//columns 열
System.out.print(ar[i][j]+ " ");
}
System.out.println();//ln 걍 줄 바꿈
}
}
}
실행결과
0 0 0
0 0 0
0 0 0
1개를 3번돌리는데 한번 돌릴때마다 ln으로 줄바꿔줘서 이렇게 나오는거임.
여기서 그냥 숫자 하나 정의하고, 그 숫자로 넣어주면 또 바뀝니다. 한 번 알아볼까요?
public static void main(String[] args) {
int n=5;
int[][] ar=new int[n][n];
for(int i=0; i<ar.length; i++) {//rows 행
for(int j=0; j<ar[i].length; j++) {//columns 열
System.out.print(ar[i][j]+ " ");
}
System.out.println();//ln 걍 줄 바꿈
}
}
실행결과
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
위쪽에서 n으로 숫자를 바꾸어주었기 때문!
다른 예문도 한번 살펴보겠습니다.
package arrays2;
public class Arrays3Test04 {
public static void main(String[] args) {
int n=3;
int[][] ar=new int[n][n];
//1 2 3
//4 5 6
//7 8 9
ar[0][0]=1; ar[0][1]=2; ar[0][2]=3;
ar[1][0]=4; ar[1][1]=5; ar[1][2]=6;
ar[2][0]=7; ar[2][1]=8; ar[2][2]=9;
for(int i=0; i<ar.length; i++) {//rows 행
for(int j=0; j<ar[i].length; j++) {//columns 열
System.out.print(ar[i][j]+ " ");
}
System.out.println();//ln 걍 줄 바꿈
}
}
}
여기서 보니까 위쪽애들이 너무 겹치니까 for문을 사용하여 한번 바꿔보도록 하겠습니다.
package arrays2;
public class Arrays3Test04 {
public static void main(String[] args) {
int n=3;
int[][] ar=new int[n][n];
//1 2 3
//4 5 6
//7 8 9
/*ar[0][0]=1; ar[0][1]=2; ar[0][2]=3;
ar[1][0]=4; ar[1][1]=5; ar[1][2]=6;
ar[2][0]=7; ar[2][1]=8; ar[2][2]=9;*/
int c=1;
for(int i=0; i<ar.length; i++) {//rows 행
for(int j=0; j<ar[i].length; j++) {//columns 열
//ar[i][j]=n*i+(j+1); 이거로 써도 되고
ar[i][j]=c++; //위에서 c선언해줬으니까 이거로 씁니다.
}
}
for(int i=0; i<ar.length; i++) {//rows 행
for(int j=0; j<ar[i].length; j++) {//columns 열
System.out.print(ar[i][j]+ " ");
}
System.out.println();//ln 걍 줄 바꿈
}
}
}
많아보이지만 기분탓,, 아무튼 이렇게 위에 있는 2가지 방법을 통해서 확인할 수 있습니다.
또 다른 예제를 살펴보도록 하겠습니다. 이번에는 스캐너!
package arrays2;
import java.util.Scanner;
public class Arrays3Test05 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.println("input num : ");
int n=in.nextInt(); //키보드에 입력된 수를 int type으로 바꿔주는 메서드
int[][] ar=new int[n][n];
//input
int c=1;
for(int i=0; i<ar.length; i++) {
for(int j=0; j<ar[i].length; j++) {
ar[i][j]=c++;
}
}
//output
for(int i=0; i<ar.length; i++) {//rows 행
for(int j=0; j<ar[i].length; j++) {//columns 열
System.out.printf("%2d ",ar[i][j]);
}
System.out.println();//ln 걍 줄 바꿈
}
}
}
실행결과
input num :
4 //키보드입력
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
위에것과 비슷합니다!!
그렇지만 지금은 스캐너를 통해서 사용자가 직접 몇행몇열 행렬을 사용할것인지를 정해주었습니다.
여기에서 c만 바꾸면
int c=9;
for(int i=0; i<ar.length; i++) {
for(int j=0; j<ar[i].length; j++) {
ar[i][j]=c--;
}
}
실행결과
input num :
3
9 8 7
6 5 4
3 2 1
이렇게 나올수있다는 점~!! 나는 이렇게 했지만 선생님은 어케했을까
int c=1;
for(int i=n-1; i>=0; i--) {
for(int j=n-1; j>=0; j--) {
ar[i][j]=c++;
}
}
실행결과는 동일함.
여기서 선언한 for문 더 위에 정방행렬을 선언하는 n임.
like this
int n=in.nextInt();
int[][] ar=new int[n][n];
응용된 버전으로 해보도록 하겠습니다.
package arrays2;
import java.util.Scanner;
public class Arrays3Test06 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.println("input num(2~9) : ");
int n=in.nextInt(); //키보드에 입력된 수를 int type으로 바꿔주는 메서드
int[][] ar=new int[n][n];
// 1 2 3 4
// 8 7 6 5
// 9 10 11 12
//16 15 14 13
//input
int c=1;
for(int i=0; i<n; i++) {
//순차접근 i:0,2 -> 1행, 3행
if(i%2==0/*짝수형 표현은 이렇게*/) {
for(int j=0; j<n; j++) {
ar[i][j]=c++;
}
}else {//역순접근 i:1,3 -> 2행, 4행
for(int j=n-1; j>=0; j--) {
ar[i][j]=c++;
}
}
}
//output
for(int i=0; i<ar.length; i++) {//rows 행
for(int j=0; j<ar[i].length; j++) {//columns 열
System.out.printf("%2d ",ar[i][j]);
}
System.out.println();//ln 걍 줄 바꿈
}
}
}
실행결과
input num(2~9) :
4
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13
이 케이스를 반대로 하면요?
for(int i=0; i<n; i++) {
//순차접근 i:0,2 -> 1행, 3행
if(i%2==1/*짝수형 표현은 이렇게*/) {
for(int j=0; j<n; j++) {
ar[i][j]=c++;
}
}else {//역순접근 i:1,3 -> 2행, 4행
for(int j=n-1; j>=0; j--) {
ar[i][j]=c++;
}
}
}
실행결과
input num(2~9) :
4
4 3 2 1
5 6 7 8
12 11 10 9
13 14 15 16
이렇게 나옵니다.
계속해서 응용해보도록 하겠습니다. 이번에는 행이 바뀌는거로 가보도록 하겠습니다.
// 1 5 9 13
// 2 6 10 14
// 3 7 11 15
// 4 8 12 16
이렇게 나오도록 해보겠습니다.
코드는?
package arrays2;
import java.util.Iterator;
import java.util.Scanner;
public class Arrays2Test07 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.println("input num(2~9) : ");
int n=in.nextInt();
int[][] ar=new int[n][n];
//input
int c=1;
//ar[0][0]=1;ar[1][0]=2;ar[2][0]=3;ar[3][0]=4; 행수치가 변하고 이게 한 사이클
//ar[0][1]=5;ar[1][1]=6;ar[2][1]=7;ar[3][1]=8;
// 이너값;아우터값;순차or역순
for (int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
ar[j][i]=c++;
}
}
//output
for(int i=0; i<ar.length; i++) {
for(int j=0; j<ar[i].length; j++) {
System.out.printf("%2d ",ar[i][j]);
}
System.out.println();
}
}
}
for문 쓸때 처음 시작할때부터 어디까지 할지 쓰고, 역순인지 순차인지 해서 쓰면 됩니다.
결과값은 처음 문제냈을때랑 똑같아요!
%3d : 3자리라는 뜻! ->이것은 println이 아니고 printf 로 해주어야 합니다.
package array;
public class ArrayTest12 {
public static void main(String[] args) {
String name[]= {"aaa", "bbb", "ccc", "ddd", "eee"};
int com[]= {80, 70, 90, 100, 55};
int rank[]=new int[5];
for(int i=0; i<5; i++) {
System.out.printf("%s : %3d %d\n",name[i], com[i], rank[i]);
}
}
}
실행결과
aaa : 80 0
bbb : 70 0
ccc : 90 0
ddd : 100 0
eee : 55 0
지금까지 배운모든것을 활용해서 가장 어렵게 만들어보도록 하겠습니다.
package arrays2;
public class Arrays2Test08 {
public static void main(String[] args) {
//3명의 학생들의 국어, 영어, 수학 점수를 입력받고 출력하세요
//총점, 평균, 순위도 출력하세요
String name[]= {"aaa","bbb","ccc"};
String sub[]= {"KOR","ENG","MAT"};
int n=sub.length;
//new int[name.length][n+2]; //k.e.m,t,r
int exam[][]= {{70,70,70,0,0},{85,80,80,0,0},{90,90,90,0,0}};
double avg[]=new double[name.length]; //학생수
//INPUT
for(int i=0; i<name.length; i++) {
//TOT
for(int j=0; j<n; j++) {
exam[i][n] += exam[i][j];
}
//AVG
avg[i]=(double)exam[i][n]/n;
}
//RANK
for(int i=0; i<name.length; i++) {
exam[i][4]=1;
for(int j=0; j<name.length; j++) {
if(exam[i][3]<exam[j][3])exam[i][4]++;
}
}
//output
System.out.printf("NAME %s %s %s TOT AVG RANK\n",sub[0], sub[1], sub[2]);
System.out.println("-------------------------------------");
for(int i=0; i<name.length; i++) {
System.out.print(name[i] +" : ");
for(int j=0; j<n+1; j++) {
System.out.printf("%3d ", exam[i][j]);
}
//avg
System.out.printf("%5.2f", avg[i]);
//rank
System.out.println(" "+exam[i][n+2-1]);
}
}
}
실행 결과
잘 나온것을 확인 할 수 있습니다. 일단 응용하는거고 배열을 더 이해하기 위한것이니 굳이 너어어무 어렵게하지 않아도 되겠습니다. //지금도 이해 못한것이 절반임^^.
배열 선언 규칙
1차원 배열
데이터 타입과 배열기호를 통해서 배열변수를 선언합니다. new를 통해서 새로 할당합니다. 걍 어려움. 책 보삼.
'프로그래밍 기초 및 응용' 카테고리의 다른 글
열거형 / 클래스 상속 (0) | 2022.03.22 |
---|---|
클래스 객체 생성 (0) | 2022.03.16 |
배열변수 (0) | 2022.03.14 |
while / for / dowhile (0) | 2022.03.11 |
부동 소수점 변환 / 연산자 (0) | 2022.02.25 |