java 배열, 다차원배열, bingo 예시, array

limchard·2023년 10월 26일
0

java

목록 보기
32/48

for문 활용하여 print

	int [] arr1,arr2; // 배열로 선언 	
	arr1=new int[3]; // 메모리 할당. 메모리 할당을 위해 숫자 반드시 기입해야함
	arr2=new int[5]; // 할당만 되도 값은 0으로 초기화가 된다. 즉 숫자는 0, String 은 null
	// arr1 배열에 값을 넣는다.
	arr1[0]=10;
	arr1[1]=5;
	arr1[2]=20;
		
	// 배열의 갯수
	System.out.println(arr1.length); // 3(0~2)
	System.out.println(arr2.length); // 5(0~4)
		
	// arr1출력
	System.out.println("arr1 출력");
	System.out.println(arr1[0]);
	System.out.println(arr1[1]);
	System.out.println(arr1[2]);
		
	// for문으로 arr1 출력 // i값을 활용 가능하다.
	System.out.println("for문으로 arr1 출력");
	for(int i=0;i<3;i++) {
		System.out.println(arr1[i]);
	}
		
	// for문으로 arr1 출력
	System.out.println("for문으로 arr1 출력_범위를 변수화 해보자 ");
	for(int i=0;i<arr1.length;i++) {
		System.out.println(arr1[i]);
	}

배열은 대괄호 [] 를 이용하여 선언한다.
대괄호 "[]"를 치면 배열이라는 의미이다.
2번째 줄에 'arr=new int[3]' 에서 배열의 메모리를 할당해준다. 즉 몇자리수 배열인지 대괄호 [] 안에 숫자를 기입한다.
대괄호 [] 안에 3을 넣은 경우 자리수는 0,1,2 이렇게 3개가 할당된다.
각 할당된 메모리(자릿수)에 해당하는 값을 지정해준다.
바로 출력도 가능하다.
하지만 보통은 for문으로 출력한다.
for(int i=0;i<3;i++) 여기서 i의 범위를 지정해줘야 한다. 기본 자릿수가 0 부터 시작해서 3개의 자릿수가 있다.
그래서 조건을 3이하로 주어 0,1,2 까지 3개를 진행하도록 해준다.

	// 문자열 배열 str1 선언과 동시에 초기화 해주자.
    // 문자열 배열 str2는 기존처럼 각각 지정해주자.

	String [] str1 = {"김밥","피자","스파게티","햄버거","짱깨","돈까스"};
		
	String [] str2 =new String[5]; // 5개의 문자열이 들어가도록 메모리할당, null로 초기화 됨
		
	// str2에 문자열 넣기
	str2[0]="초록";
	str2[1]="노랑";
	str2[4]="파랑";
		
	// str1을 변수 i를 이용해서 출력
	// 예시) 음식1: 김밥..
	System.out.println("str1 출력 ");
	for(int i=0;i<str1.length;i++) {
		System.out.println("음식"+(i+1)+": "+str1[i]);
	}

배열은 문자열로도 적용이 가능하다.
또한 1번 열과 같이 중괄호 {}를 이용하여 배열 선언과 동시에 초기화 및 부여가 가능하다.
str1처럼 기입하면 str2처럼 일일이 기입하지 않고 한줄로 나열하여 기입 가능하다.

출력시는 똑같이 하고, for문의 조건의 경우 str1.length를 이용하면 편리하다.
항이 5개의 경우 0,1,2,3,4 까지 5개이다.
여기서 length는 길이를 나타내므로 5가 된다.
주어진 자릿수의 갯수와 length가 동일하므로 for문 조건에 length를 사용하면, 할당된 메모리량(자릿수량)이 많아졌을 때 활용하기 쉽다.

추가로 위에서 설명한바와 같이 할당된 메모리량 자리(0,1,2,3...)을 수식에 이용할 수 있다.
위 코드를 참고해보자.

max,min 값 도출

	int [] data= {42,4,56,235,346,7653,3456,23,2,234};
		
	System.out.println("data의 길이: "+data.length);
	System.out.println("data의 길이: "+data.length);

	int max=data[0]; // 첫데이터를 무조건 최대값에 저장
	int min=data[0];
	// 두번째 값부터 끝까지 max와 각각 비교
	for(int i=1;i<data.length;i++) {
		if(max<data[i])
			max=data[i];
			
		if(min>data[i])
			min=data[i];
		}
		
	System.out.println("최대값: "+max);
	System.out.println("최소값: "+min);

결과

data의 길이: 10
data의 길이: 10
최대값: 7653
최소값: 2

최대값, 최소값을 구해보자.
일단 첫데이터를 0번항으로 고정하고, 그 이후 1번항부터 뒤쪽 항까지 모두 각가 비교하는 개념으로 진행한다.
비교데이터는 항의 수가 정해져 있기 때문에 for문으로 진행한다.

다차원배열

	int[][]arr;
	arr=new int[2][3]; // 2행 3열로 할당.(row,column)
		
	// 초기값
	arr[0][0]=10;
	arr[0][1]=20;
	arr[0][2]=30;
		
	arr[1][0]=5;
	arr[1][1]=10;
	arr[1][2]=20;
		
	// 행의 갯수 
	System.out.println("행의갯수: "+arr.length);
		
	// 열의 갯수 : 열의 갯수는 행의 갯수처럼 한번에 못 구한다. 각 행의 열갯수를 각각 구해야 한다.
	System.out.println("0행의 열갯수: "+arr[0].length);
	System.out.println("1행의 열갯수: "+arr[1].length);
		
	System.out.println("***데이터 출력***");
	for(int i=0;i<arr.length;i++) { // 행
		for(int j=0;j<arr[i].length;j++) { // 열
//			System.out.print(arr[i][j]+"\t");
			System.out.printf("%d,%d=%2d\t",i,j,arr[i][j]);
		}
	System.out.println();
	}
		
	System.out.println("2차원 배열에 값변경후 다시 출력");
	
	arr[0][1]=1000;
	arr[1][0]=2000;
	arr[1][2]=3000;
		
	System.out.println("***데이터 출력***");
	for(int i=0;i<arr.length;i++) { // 행
		for(int j=0;j<arr[i].length;j++) { // 열
//			System.out.print(arr[i][j]+"\t");
			System.out.printf("%d,%d=%2d\t",i,j,arr[i][j]);
		}
	System.out.println();
	}

결과

행의갯수: 2
0행의 열갯수: 3
1행의 열갯수: 3
***데이터 출력***
0,0=10 0,1=20 0,2=30
1,0= 5 1,1=10 1,2=20
2차원 배열에 값변경후 다시 출력
***데이터 출력***
0,0=10 0,1=1000 0,2=30
1,0=2000 1,1=10 1,2=3000

다차원배열이다.
기본적으로 자릿수는 행렬로 나타낸다고 생각하면 된다.
기본을 이해하는게 크게 어렵진 않다.

	int[][]arr= {
			{39,43},
			{67,87,80},
			{71,32,24,42}
			};
		
	System.out.println("총 행갯수: "+arr.length);	
	System.out.println("0번행의 열갯수: "+arr[0].length);
	System.out.println("0번행의 열갯수: "+arr[1].length);
	System.out.println("0번행의 열갯수: "+arr[2].length);
		
	for(int i=0;i<arr.length;i++) { // 행
		for(int j=0;j<arr[i].length;j++) { // 열
			System.out.printf("[%d][%d]=[%d]\t",i,j,arr[i][j]);
		}
		System.out.println();
	}

결과

총 행갯수: 3
0번행의 열갯수: 2
0번행의 열갯수: 3
0번행의 열갯수: 4
[0][0]=[39] [0][1]=[43]
[1][0]=[67] [1][1]=[87] [1][2]=[80]
[2][0]=[71] [2][1]=[32] [2][2]=[24] [2][3]=[42]

위 코드와 같이 다차원배열도 선언과 동시에 초기화할 수 있다.
보통 보기 편하게 하기위해 중괄호가 끝나면 다음 line으로 넘어가서 적는다.
추가로 행과 열의 숫자가 꼭 맞을 필요는 없다.
위 다중 배열의 경우 3행이지만, 각 행마다 열의 갯수가 다르다.


bingo 예제

Scanner sc=new Scanner(System.in);
		
// 3행 3열의 다차원 배열
int[][]pz=new int[3][3];
int bingo=0;
		
while(true) {
	System.out.println("***한줄에 같은 숫자 나오면 빙고!!***");
			
	// 3행 3열 안에 1~3까지의 난수를 발생시켜야 함
	for(int i=0;i<pz.length;i++) { //행 
		for(int j=0;j<pz[i].length;j++) { //열 
			pz[i][j]=(int)(Math.random()*3+1);
		}
	}
			
	//출력
	for(int i=0;i<pz.length;i++) { //행 
		for(int j=0;j<pz[i].length;j++) { //열 
			System.out.printf("%4d",pz[i][j]);
		}
	System.out.println();
	}

	// 빙고 갯수
	bingo=0; // 빙고갯수 초기화 
			
	// 가로방향 3개, 세로방향 3개
	for(int i=0;i<pz.length;i++) {
		// 가로방향 비교
		if(pz[i][0]==pz[i][1]&&pz[i][1]==pz[i][2])
			bingo++;			
		// 세로방향 비교 
		if(pz[0][i]==pz[1][i]&&pz[1][i]==pz[2][i])
			bingo++;

	}
	// 대각선 / 빙고 
	if(pz[0][0]==pz[1][1]&&pz[1][1]==pz[2][2])
		bingo++;
	// 대각선 \ 빙고 
	if(pz[0][2]==pz[1][1]&&pz[1][1]==pz[2][0])
		bingo++;
	// 빙고출력
		
	if(bingo==0) {
		System.out.println("\t꽝");
	}
	else
		System.out.println("\t"+bingo);
			
	// 게임종료
			
	String ans=sc.nextLine();// 엔터를 누르면 다음 난수가 나온다.
	System.out.println("총 "+bingo+"개의 빙고가 완성되었습니다.");
			
	if(ans.equals("q")) {
		System.out.println("게임을 종료합니다.");
		break;
	}
}

결과 1

***한줄에 같은 숫자 나오면 빙고!!***
3 2 2
1 2 2
2 2 3
2

결과 2

***한줄에 같은 숫자 나오면 빙고!!***
1 2 1
1 3 2
2 1 2
꽝

bingo 예제이다.
행과 열은 변수를 통해 빙고를 구할 수 있지만 대각선 빙고의 경우 일일이 지정을 해줘야 한다.
해당 빙고도 3개를 한번에 비교할 수는 없다.
2개씩 묵어서 서로 같은지 비교를 해야한다.

for-each문을 활용하여 print

int [] arr1,arr2; // 배열로 선언 	
arr1=new int[3]; // 메모리 할당. 메모리 할당을 위해 숫자 반드시 기입해야함
arr2=new int[5]; // 할당만 되도 값은 0으로 초기화가 된다. 즉 숫자는 0, String 은 null
		
//int [] arr1=new int[3];
//int arr2 []=new int[5];
		
// arr1 배열에 값을 넣는다.
arr1[0]=10;
arr1[1]=5;
arr1[2]=20;
        
// for~each : (배열변수자료형 임의의이름 : 변수명) i값을 활용 불가능 하다.
System.out.println("for~each_arr1");
for(int a1:arr1) {
	System.out.println(a1);
}

기본 배열 사항은 같다.
출력시에 for문이 아닌 for~each문을 사용해보자.
for(int or String 배열변수자료형 임의의이름 : 변수형) 으로 print가 된다.
기본 변수형의 모든 자료가 지정한 a1으로 넘어가고 출력한다.
다만 주어진 메모리자리(자릿수)는 사용이 불가능하다.

profile
java를 잡아...... 하... 이게 맞나...

0개의 댓글