프로그래밍 기초 및 응용

2차원 배열

황샐리 2022. 3. 15. 16:31

이차원 배열

 

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