JAVA

DAY 6 - 다차원 배열 (2024.07.10)

summ.n 2024. 8. 13. 09:02

오늘은 다차원 배열 내용에 대해서 들어갔다... 1차원 배열이랑은 차원이 다르게 훨씬 어려웠다는거,,,

이론은 적지만 실습들이 꽤나 어려웠다ㅠㅠ 이론부터 정리를 해보자면 !!!

 

* 다차원 배열

- 생성할 때 행의 개수 꼭 써야 한다

 

1. 고정길이 - 자료형[][] 배열명 = { {값1, 값2,...}, {값3, 값4,...}, {...},...};

- 자료형[][] 배열명;

 

배열명=new 자료형[개수][개수];

 

2. 가변길이

- 자료형[][] 배열명;

 

배열명 = new 자료형[개수][];

배열명[0] = new 자료형[개수];

배열명[1] = new 자료형[개수];

배열명[2] = new 자료형[개수];

 


MultiArray01.java

package multiArray;

public class MultiArray01 {

	public static void main(String[] args) {
		int[][] ar;
		//int ar[][];
		ar = new int[3][2]; 
		
		ar[0][0] = 10;
		ar[0][1] = 20;
		
		ar[1][0] = 30;
		ar[1][1] = 40;
		
		ar[2][0] = 50;
		ar[2][1] = 60;	
		
		System.out.println("배열명 ar = " + ar);
		
		for(int i=0; i<ar.length; i++) {//행			
			System.out.println("ar[" + i + "] = " + ar[i]);
			for(int j=0; j<ar[i].length; j++) {//열
				System.out.println("ar["+ i + "][" + j + "] = " + ar[i][j]);
			}
			System.out.println();
		}
	}

}
 
배열명 ar = [[I@372f7a8d
ar[0] = [I@85ede7b
ar[0][0] = 10
ar[0][1] = 20

ar[1] = [I@7229724f
ar[1][0] = 30
ar[1][1] = 40

ar[2] = [I@4c873330
ar[2][0] = 50
ar[2][1] = 60

 

ar.length / ar[i].length

위에 두 개 차이를 알아야 한다 !!

ar.length는 행 즉 위에서는 3이 되는 것이고

ar[i].length는 열 즉 위에서는 2가 되는 것이라고 할 수 있다.


MultiArray02.java

  • 1~100까지 출력하는 기본 실습
package multiArray;

public class MultiArray02 {

	public static void main(String[] args) {
		int[][] ar = new int[10][10];
		int num = 0;
		
		//입력
		/*
		for(int i=0; i<ar.length; i++) {
			for(int j=0; j<ar[i].length; j++) {
				num++;
				ar[i][j] = num;
			}
		}
		*/
		
		/*
		for(int i=0; i<ar.length; i++) {
			for(int j=0; j<ar[i].length; j++) {
				num++;
				ar[j][i] = num;
			}
		}
		*/
		
		for(int i=ar.length-1; i>=0; i--) {
			for(int j=ar[i].length-1; j>=0; j--) {
				num++;
				ar[i][j] = num;
			}
		}
		
		//출력
		for(int i=0; i<ar.length; i++) {//행			
			for(int j=0; j<ar[i].length; j++) {//열
				System.out.print(String.format("%5d", ar[i][j]));
			}
			System.out.println();
		}
	}

}
 
  100   99   98   97   96   95   94   93   92   91
   90   89   88   87   86   85   84   83   82   81
   80   79   78   77   76   75   74   73   72   71
   70   69   68   67   66   65   64   63   62   61
   60   59   58   57   56   55   54   53   52   51
   50   49   48   47   46   45   44   43   42   41
   40   39   38   37   36   35   34   33   32   31
   30   29   28   27   26   25   24   23   22   21
   20   19   18   17   16   15   14   13   12   11
   10    9    8    7    6    5    4    3    2    1
 

MultiArray03.java

package multiArray;

public class MultiArray03 {

	public static void main(String[] args) {
		int[][] ar = {{1, 2, 3, 0}, {4, 5, 6, 0}, {7, 8, 9, 0}, {0, 0 , 0, 0}}; //4행 4열

		//계산1
		for(int i=0; i<ar.length-1; i++) {
			for(int j=0; j<ar[i].length-1; j++) {
				ar[i][3] += ar[i][j];
				
				//ar[3][i] += ar[j][i];
				ar[3][j] += ar[i][j];
				
				ar[3][3] += ar[i][j];
			}
		}
		
		//출력
		for(int i=0; i<ar.length; i++) {//행			
			for(int j=0; j<ar[i].length; j++) {//열
				System.out.print(String.format("%5d", ar[i][j]));
			}
			System.out.println();
		}
	}

}
 
    1    2    3    6
    4    5    6   15
    7    8    9   24
   12   15   18   45
 

[QUIZ1] 성적 계산

 

1. 공식

총점 = 국어 + 영어 + 수학

평균 = 총점 / 과목수

학점은 평균이 90이상이면 A

80이상이면 B

70이상이면 C

60이상이면 D

그 외는 F

 

2. 평균은 소수이하 2째자리까지 출력

 

----------------------------------------------------

이름 국어 영어 수학 총점 평균 학점

----------------------------------------------------

홍길동 90 95 100

프로도 100 89 76

라이언 75 80 48

----------------------------------------------------

 

MultiArray04.java

package multiArray;

public class MultiArray04 {

	public static void main(String[] args) {
		String[] name = {"홍길동", "프로도", "라이언"};
		int[][] jumsu = {{90, 95, 100, 0}, {100, 89, 76, 0}, {75, 80, 48, 0}}; 
		double[] avg = new double[3];
		char[] grade = new char[3];

		for(int i=0; i<jumsu.length; i++) {
			for(int j=0; j<jumsu[i].length-1; j++) {
				jumsu[i][3] += jumsu[i][j];
			}//총점
			
			
			avg[i] = (double)jumsu[i][3] / 3; //평균
			
			
			//학점
			if(avg[i] >= 90) {
				grade[i] = 'A';
			}
			else if(avg[i] >=80) {
				grade[i] = 'B';
			}
			else if(avg[i] >=70) {
				grade[i] = 'C';
			}
			else if(avg[i] >=60) {
				grade[i] = 'D';
			}else {
				grade[i] = 'F';
			} 
		}



		/*
		for(int i=0; i<jumsu.length; i++) {//행			
			for(int j=0; j<jumsu[i].length; j++) {//열
				System.out.print(String.format("%5d", jumsu[i][j]));
			}
			System.out.println();
		}

		for(int i=0; i<avg.length; i++) {		
			System.out.print(String.format("%.2f", avg[i]));
			System.out.println();
		}


		for(int i=0; i<grade.length; i++) {		
			System.out.print(String.format("%c", grade[i]));
			System.out.println();
		}
		 */

		//출력
		System.out.println("----------------------------------------------------");
		System.out.println("이름\t국어\t영어\t수학\t총점\t평균\t학점");
		System.out.println("----------------------------------------------------");

		for(int i=0; i<jumsu.length; i++) {
			System.out.print(name[i] + "\t");

			for(int j=0; j<jumsu[i].length; j++) {
				System.out.print(jumsu[i][j] + "\t");
			}
			System.out.println(String.format("%.2f", avg[i]) + "\t" + grade[i]);		
		}
		System.out.println("----------------------------------------------------");

	}

}
 
----------------------------------------------------
이름	국어	영어	수학	총점	평균	학점
----------------------------------------------------
홍길동	90	95	100	285	95.00	A
프로도	100	89	76	265	88.33	B
라이언	75	80	48	203	67.67	D
----------------------------------------------------
 

여기 가변길이부터 진짜 헷갈리기 시작.....

이론을 확실히 잡고 가자.

 

int[][] ar = new int[3][];

위 코드는 즉, 3행에 ?열이라고 생각하면 된다. 말 그대로 가변길이인 것이다.

밑에 코드 처럼 할당을 해주게 되면 열이 생성되는 것이다.

 

MultiArray05.java

package multiArray;

public class MultiArray05 {

	public static void main(String[] args) {
		//다차원 배열 - 가변길이(행은 고정)
		int[][] ar = new int[3][];
		ar[0] = new int[2];
		ar[1] = new int[3];
		ar[2] = new int[4];

		ar[0][0] = 10;
		ar[0][1] = 20;

		ar[1][0] = 30;
		ar[1][1] = 40;
		ar[1][2] = 50;

		ar[2][0] = 60;
		ar[2][1] = 70;
		ar[2][2] = 80;
		ar[2][3] = 90;

		for(int i=0; i<ar.length; i++) {//행			
			for(int j=0; j<ar[i].length; j++) {//열
				System.out.println("ar["+ i + "][" + j + "] = " + ar[i][j]);
			}
			System.out.println();
		}
	}
}
 
ar[0][0] = 10
ar[0][1] = 20

ar[1][0] = 30
ar[1][1] = 40
ar[1][2] = 50

ar[2][0] = 60
ar[2][1] = 70
ar[2][2] = 80
ar[2][3] = 90

 

[QUIZ 2] 야구게임

- 크기가 3개인 정수형 배열을 잡고 1~9사이의 난수를 발생한다

- 발생한 난수를 맞추는 게임

- 난수는 중복을 제거한다

 

[실행결과]

게임을 실행하시겠습니까(Y/N) : w

게임을 실행하시겠습니까(Y/N) : u

게임을 실행하시겠습니까(Y/N) : y

 

게임을 시작합니다

 

숫자입력 : 123

0스트라이크 0볼

 

숫자입력 : 567

0스트라이크 2볼

 

숫자입력 : 758

1스트라이크 2볼

...

 

숫자입력 : 785

3스트라이크 0볼

 

프로그램을 종료합니다.

 

package array;

import java.io.IOException;
import java.util.Scanner;

public class BaseBall {

	public static void main(String[] args) throws IOException {
		Scanner scan = new Scanner(System.in);

		int[] com = new int[3];
		int[] user = new int[3];
		String yn;
		int strike, ball;

		do{
			System.out.print("게임을 실행하시겠습니까(Y/N) : ");
			yn = scan.next();
		}while(!yn.equalsIgnoreCase("Y") && !yn.equalsIgnoreCase("N"));

		if(yn.equalsIgnoreCase("Y")) {
			System.out.println("게임을 시작합니다.");

			for(int i=0; i<com.length; i++) {
				com[i] = (int)(Math.random() * 9 + 1);
				//중복확인
				for(int j=0; j<i; j++) {
					if(com[i] == com[j]) {
						i--;
						break;
					}
				}//for j
			}//for i	
			
			
			//사용자가 숫자입력
			while(true) {
				System.out.print("숫자입력: ");
				for(int i=0; i<user.length; i++){
					user[i] = System.in.read() - '0';
				}
				System.in.read();
				System.in.read(); //enter값 처리 필수 ★★★★★
				
				System.out.println(com[0] + "," + com[1] + "," + com[2]);
				System.out.println(user[0] + "," + user[1] + "," + user[2]);
				
				//비교
				strike = 0;
				ball = 0; //반드시 초기화 !!! ★★★★★
				for(int i=0; i<com.length; i++) {
					for(int j=0; j<user.length; j++) {
						if(com[i] == user[j]) {
							if(i == j) strike++;
							else ball++;
						}
					}
				}
				System.out.println(strike + "스트라이크 " + ball + "볼");
                System.out.println();
				
				if(strike == 3) break;
			}
		}
		System.out.println("프로그램을 종료합니다.");
	}
}
 
게임을 실행하시겠습니까(Y/N) : e
게임을 실행하시겠습니까(Y/N) : t
게임을 실행하시겠습니까(Y/N) : y
게임을 시작합니다.
숫자입력: 456
4,5,6
1스트라이크 1볼

숫자입력: 423
4,2,3
0스트라이크 0볼

숫자입력: 459
4,5,9
1스트라이크 0볼

숫자입력: 753
7,5,3
1스트라이크 1볼

숫자입력: 657
6,5,7
3스트라이크 0볼
프로그램을 종료합니다.
 

System.out.print("숫자입력: ");

for(int i=0; i<user.length; i++){

user[i] = System.in.read() - '0';

}

System.in.read();

System.in.read(); //enter값 처리 필수 ★★★★★

 

이쪽 코드가 관건이었는데

숫자를 입력했을 때 하나씩 받아 user[i]에 넣기위해서 System.in.read()을 이용하는 것이다.

추가로 엔터값이 포함되므로 System.in.read(); 두 번을 해줘서 enter 값을 처리해줘야 한다.