2차원 배열, 가변배열

oYJo·2024년 12월 17일

Java

목록 보기
14/25
post-thumbnail

2차원 배열

자료형이 같은 1차원 배열의 묶음으로 배열 안에 다른 배열이 존재
2차원 배열은 할당된 공간마다 인덱스 번호 두 개 부여 (앞 번호는 행, 뒷 번호는 열 ([0][0]) )

인덱스 값 이해

2차원 배열 선언

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

2차원 배열 할당

자료형[ ][ ] 배열명 = new 자료형[행크기][열크기];
자료형 배열명[ ][ ] = new 자료형[행크기][열크기] ;
자료형[ ] 배열명[ ] = new 자료형[행크기][열크기] ;

ex) int[][] arr = new int[3][4];
int arr[][] = new int[3][4];

2차원 배열 구조

int[] arr = new int[3];
자료형 변수명
int배열 참조변수로 대입한다, 선언했다
int 3 배열을 할당(생성)

int[][] arr = new int[2][4];
int[][]을 참조하는 변수 arr 선언
heap영역에 새롭게 2행 4열(가로 2줄, 세로 4줄)
int 2차원 배열을 할당(생성)

Heap 시작 주소 형성 → 생성된 int 2차원 배열의 시작 주소를 arr에 대입

2차원 배열 초기화

  • 인덱스를 이용한 초기화
    ex) arr[0][0] = 1;
    arr[1][1] = 2;

  • for문을 이용한 초기화
    ex) for(int i = 0; i < arr.length; i++) {
    for(int j = 0; j < arr[i].length; j++) {
    arr[i][j] = j;
    }
    }

  • 선언과 동시에 초기화
    ex) int[][] arr = {{1, 2, 3, 4}, {5, 6, 7, 8}};
    int[][] arr = new int[][] {{1, 2, 3, 4}, {5, 6, 7, 8}};
    String fruit[][] = {{"사과", "딸기", "석류"}, {"바나나", "참외", "레몬"}};

int 2차원 배열을 참조하는 참조 변수 선언
(참조형 == 참조 변수 == 레퍼런스 변수 == 레퍼런스)

2차원 배열 할당
-> new 자료형[행크기][열크기]

class Array2Example(ex1)

	public void ex1() {
		
		// 2차원 배열 선언
		int[][] arr;
		
		// int 2차원 배열을 참조하는 참조 변수 선언
		// (참조형 == 참조 변수 == 레퍼런스 변수 == 레퍼런스)
		
		// 2차원 배열 할당
		// -> new 자료형[행크기][열크기]
		
		arr = new int[2][3];
		// heap 영역에 int 2차원 배열 2행 3열 공간을 할당
		
		// 2차원 배열 초기화
		
		// 1) 행, 열 인덱스를 이용해서 직접 초기화
		/*
		arr[0][0] = 10;
		arr[0][1] = 20;
		arr[0][2] = 30;
		
		arr[1][0] = 40;
		arr[1][1] = 50;
		arr[1][2] = 60;
		 */

		// 2) 2중 for문을 이용한 초기화
		int num = 10; // 배열 요소 초기화에 사용할 변수
		
		System.out.println(arr.length); // 2 (행 길이)
		System.out.println(arr[0].length); // 3 (열 길이)
		// arr[0] 행이 참조하고 있는 1차원 배열(열)의 길이
		
		for(int row=0; row<2; row++) { // 행 반복(0,1)
			
			for(int col=0; col<arr[row].length; col++) { // 열 반복(0,1,2)
				arr[row][col] = num;
				num += 10; // 10씩 증가
			}
		}
		
		// Arrays.toString(배열명) : 참조하고 있는 1차원 배열 값을 문자열로 반환
		System.out.println(Arrays.toString(arr));
		
		// Arrays.deepToString(배열명)
		// - 참조하고 있는 배열의 데이터가 나오는 부분까지 파고 들어가서
		//   모든 값을 문자열로 반환
		System.out.println(Arrays.deepToString(arr));
	}
}

class Array2Example(ex2)

	public void ex2() {
		// 2차원 배열 선언과 동시에 초기화
		
		// 3행 3열짜리 정수형 2차원 배열 선언과 동시에
		// 1~9까지 초기화
		
		int[][] arr = { {1,2,3},
						{4,5,6},
						{7,8,9}};
				
		// 행 별로 합 출력	
		for(int row=0; row<arr.length; row++) { // 행 반복
			int sum = 0;
			
			for(int col=0; col<arr[row].length; col++) { // 열 반복
				sum += arr[row][col];
				
				
			}
			System.out.printf("%d행의 합 : %d\n", row, sum);
			
		}
		System.out.println("-----------------------");
		
		// 열 별로 합 출력
		// -> 열 부터 지정 후 각 행의 값을 누적
		// --> 완전한 사각형의 형태를 지닌 2차원 배열은
		// 	   모든 열의 길이가 같다.
		
		for(int col=0; col<arr[0].length; col++) { // 열 반복
							// row cannot be resolved to a variable
							// row -> 0
			int sum = 0;
			for(int row=0; row<arr.length; row++){ // 행 반복
				sum += arr[row][col];
				
			}
			System.out.printf("%d열의 합 : %d\n", col, sum);
		}
		
		System.out.println("-----------------------");
		
		// 전체 합 출력
		int sum = 0;
		for(int row=0; row<arr.length; row++) { // 행 반복
			for(int col=0; col<arr[row].length; col++) { // 열 반복
				sum += arr[row][col];
			}
		}
		System.out.println("전체 합 : " + sum);
	}
}

2차원 배열 실습 문제

실습문제 1

class Array2Practice

package edu.kh.array2.practice;

import java.util.Arrays;
import java.util.Scanner;

public class Array2Practice {

	// 3행 3열짜리 문자열 배열을 선언 및 할당하고
	// 인덱스 0행 0열부터 2행 2열까지 차례대로 접근하여
	// "(0, 0)"과 같은 형식으로 저장 후 출력하세요.


	public void practice1() {
		String[][] arr = new String[3][3];
		for(int row=0; row<arr.length; row++) {

			for(int col=0; col<arr[row].length; col++) {
				System.out.printf("(%d, %d)", row, col); 
				// 선생님 코드 : arr[row][col] ="(" + row + ", " + col + ")";
			}
			System.out.println();
		}

	}

실습문제 2

class Array2Practice


	public void practice2() {
		int[][] arr = new int[4][4];

		int num = 1;
		for(int row = 0; row < arr.length; row++) {
			for(int col= 0; col < arr[row].length; col++) {
				arr[row][col] = num++;
				System.out.printf("%3d", arr[row][col]); 
			}
			System.out.println();
		}
	}

실습문제 3

class Array2Practice


	public void practice3() {
		int[][] arr = new int[4][4];

		int num = 16;

		for(int row = 0; row < arr.length; row++) {
			for(int col= 0; col < arr[row].length; col++) {
				arr[row][col] = num--;
				System.out.printf("%5d", arr[row][col]); 
			}
			System.out.println();
		}
	}

실습문제 4

class Array2Practice


	public void practice4() {
		int[][] arr = new int[4][4];

		// 상수 사용법 : 변하지 않는 특정 값에 이름을 붙여줌
		final int ROW_LAST_INDEX = arr.length - 1;
		final int COL_LAST_INDEX = arr[0].length - 1;

		for (int row = 0; row < arr.length; row++) { // 행 반복
			// 행의 길이
			for (int col = 0; col < arr[row].length; col++) { // 열 반복
				// row번째 행의 열의 길이

				// 마지막 행, 마지막 열이 아닌 경우
				if (row != ROW_LAST_INDEX && col != COL_LAST_INDEX) {
					arr[row][col] = (int)(Math.random() * 10 + 1);

					arr[row][COL_LAST_INDEX] += arr[row][col];
					arr[ROW_LAST_INDEX][col] += arr[row][col];
					arr[ROW_LAST_INDEX][COL_LAST_INDEX] += arr[row][col] * 2;
				}
				System.out.printf("%5d ", arr[row][col]);
			}
			System.out.println();
		}
	}

실습문제 5

class Array2Practice

	public void practice5() {
		Scanner sc = new Scanner(System.in);

		char[][] arr;
		char ch = 'a';

		System.out.print("행 크기 : ");
		int rowSize = sc.nextInt();
		System.out.print("열 크기 : ");
		int colSize = sc.nextInt();

		arr = new char[rowSize][];

		for (int row = 0; row < arr.length; row++) {
			arr[row] = new char[colSize];

			for (int col = 0; col < arr[row].length; col++)
				arr[row][col] = (char)((Math.random() * 26) + 65);;
		}

		for (int row = 0; row < arr.length; row++) {
			for (int col = 0; col < arr[row].length; col++)
				System.out.print(arr[row][col] + " ");

			System.out.println();
		}

	}

💫선생님

	public void practice5_teacher() {

		Scanner sc = new Scanner(System.in);

		while(true) {
			System.out.print("행 크기 : ");
			int row = sc.nextInt();

			System.out.print("열 크기 : ");
			int col = sc.nextInt();

			if(row<1 || row > 10 || col < 1 || col > 10 ) { // 1~10 사이 숫자가 아닌 경우
				System.out.println("반드시 1~10 사이의 점수를 입력해야 합니다.");
			}
			else {
				char[][] arr = new char[row][col];

				for(int i=0; i<row; i++) {
					for(int j=0; j<col; j++) {
						arr[i][j] = (char)(Math.random()*26+65);

						System.out.print(arr[i][j] + " ");
					}
					System.out.println();
				}
				break;
			}
		}
	}

실습문제 6

class Array2Practice


	public void practice6() {
		Scanner sc = new Scanner(System.in);

		char result = 'a';
		System.out.print("행 크기 : ");
		int row = sc.nextInt();
		char[][] arr = new char[row][];


		for (int i = 0; i < arr.length; i++) {
			System.out.print("열 크기 : "); // 수 만큼의 반복을 통해 열의 크기 받기
			int col = sc.nextInt();

			arr[i] = new char[col];
		}			
		// 출력용 for문
		for (int i = 0; row < arr[i].length; i++) {
			for(int col=0; col<arr[row].length; col++) {

				arr[row][col] = result++;
				System.out.println(arr[row][col]+" ");
			}
			System.out.println();
		}
	}

실습문제 7

class Array2Practice


	public void practice7() {	
		String[] students = {"강건강", "남나나", "도대담", "류라라", "문미미", "박보배", 			"송성실", "윤예의", "진재주", "차천축", "피풍표", "홍하하"};

		String[][] arr1 = new String[3][2];
		String[][] arr2 = new String[3][2];

		int row=0;	
		int col=0;

		System.out.println("== 1분단 ==");	
		for (int i = 0; i < students.length; i++) {
			if (i < students.length / 2) {			
				arr1[row][col] = students[i];
				System.out.print(arr1[row][col] + " ");			
				col++;

				if (col == arr1[row].length) {
					row++;
					col = 0;
					System.out.println();
				}	
			} else {
				arr2[row][col] = students[i];
				System.out.print(arr2[row][col] + " ");			
				col++;
				if (col == arr2[row].length) {
					row++;
					col = 0;
					System.out.println();
				}
			}	
			if (i == students.length / 2 - 1) {			
				row = 0;
				col = 0;
				System.out.println("== 2분단 ==");
			}	
		}

	}

💫선생님


	public void practice7_teacher() {
		String[] students = {"강건강", "남나나", "도대담", "류라라", "문미미", "박보배", 			"송성실", "윤예의", "진재주", "차천축", "피풍표", "홍하하"};

		String[][] arr1 = new String[3][2];
		String[][] arr2 = new String[3][2];

		int index = 0;
		System.out.println("== 1분단 ==");
		for(int row=0; row<arr1.length; row++) {
			for(int col=0; col<arr1[row].length; col++) {

				arr1[row][col] = students[index++];
				// students 배열 index번째 학생을 arr1[row][col]에 대입

				System.out.print(arr1[row][col]+" ");
			}
			System.out.println();
		}

		System.out.println("== 2분단 ==");
		for(int row=0; row<arr2.length; row++) {
			for(int col=0; col<arr2[row].length; col++) {

				arr2[row][col] = students[index++];
				// students 배열 index번째 학생을 arr1[row][col]에 대입

				System.out.print(arr2[row][col]+" ");
			}
			System.out.println();
		}
	}

실습문제 8

class Array2Practice


	public void practice8() {
		Scanner sc = new Scanner(System.in);
		String[] students = {"강건강", "남나나", "도대담", "류라라", "문미미", "박보배", 			"송성실", "윤예의", "진재주", "차천축", "피풍표", "홍하하"};

		String[][] arr1 = new String[3][2];
		String[][] arr2 = new String[3][2];

		int row=0;	
		int col=0;

		System.out.println("== 1분단 ==");	
		for (int i = 0; i < students.length; i++) {
			if (i < students.length / 2) {			
				arr1[row][col] = students[i];
				System.out.print(arr1[row][col] + " ");			
				col++;

				if (col == arr1[row].length) {
					row++;
					col = 0;
					System.out.println();
				}	
			} else {
				arr2[row][col] = students[i];
				System.out.print(arr2[row][col] + " ");			
				col++;
				if (col == arr2[row].length) {
					row++;
					col = 0;
					System.out.println();
				}
			}
			if (i == students.length / 2 - 1) {			
				row = 0;
				col = 0;
				System.out.println("== 2분단 ==");
				//			}	
				//			System.out.println("=============");
				//			System.out.println("검색할 학생 이름을 입력하세요 : ");
				//			String name = sc.next();
				//			
				//			// 1분단, 2분단
				//			
				//			// 왼쪽, 오른쪽
				//			
				//			System.out.printf("검색하신 %s 학생은 %d분단 %d번째 줄에 있습니다", name, );
				//			
			}
		}
	}

💫선생님

	public void practice8_teacher() {
		String[] students = {"강건강", "남나나", "도대담", "류라라", "문미미", "박보배", 			"송성실", "윤예의", "진재주", "차천축", "피풍표", "홍하하"};

		String[][] arr1 = new String[3][2];
		String[][] arr2 = new String[3][2];

		int index = 0;
		System.out.println("== 1분단 ==");
		for(int row=0; row<arr1.length; row++) {
			for(int col=0; col<arr1[row].length; col++) {

				arr1[row][col] = students[index++];
				// students 배열 index번째 학생을 arr1[row][col]에 대입

				System.out.print(arr1[row][col]+" ");
			}
			System.out.println();
		}

		System.out.println("== 2분단 ==");
		for(int row=0; row<arr2.length; row++) {
			for(int col=0; col<arr2[row].length; col++) {

				arr2[row][col] = students[index++];
				// students 배열 index번째 학생을 arr1[row][col]에 대입

				System.out.print(arr2[row][col]+" ");
			}
			System.out.println();
		}
		System.out.println("=========================");
		Scanner sc = new Scanner(System.in);
		System.out.print("검색할 학생 이름을 입력하세요 : ");
		String name = sc.next();

		for(int row=0; row<arr1.length; row++) {
			for(int col=0; col<arr1[row].length; col++) {
				if(arr1[row][col].equals(name)) { // 일치하는 학생 이름이 있을 경우

					if(col == 0) {
						System.out.printf("검색하신 %s 학생은 1분단 %d번째 줄 왼쪽에 있습니다.", name, row+1);
					} else {
						System.out.printf("검색하신 %s 학생은 1분단 %d번째 줄 오른쪽에 있습니다.", name, row+1);
					}

					System.out.println("\n있음");
				}
			}
		}

		for(int row=0; row<arr2.length; row++) {
			for(int col=0; col<arr2[row].length; col++) {
				if(arr2[row][col].equals(name)) { // 일치하는 학생 이름이 있을 경우

					if(col == 0) {
						System.out.printf("검색하신 %s 학생은 2분단 %d번째 줄 왼쪽에 있습니다.", name, row+1);
					} else {
						System.out.printf("검색하신 %s 학생은 2분단 %d번째 줄 오른쪽에 있습니다.", name, row+1);
					}

					System.out.println("\n있음");
				}
			}
		}
	}

실습문제 9

class Array2Practice

	public void practice9() {
		Scanner sc = new Scanner(System.in);
		String[][] arr = new String[6][6];

		System.out.print("행 인덱스 입력 : ");	
		int rowIndex = sc.nextInt();	
		System.out.print("열 인덱스 입력 : ");
		int colIndex = sc.nextInt();		

		for (int row = 0; row < arr.length; row++) {		
			for (int col = 0; col < arr[row].length; col++) {

				if(row == 0 && col != 0) {
					arr[row][col] = col-1 + " ";
					// col-1 // Type mismatch: cannot convert from int to String
					// col-1 + " " // 오류 해결
				} else if(row!=0 && col==0) {
					arr[row][col] = row-1 + " ";
				} else {arr[row][col] = " ";
				}

				arr[rowIndex+1][colIndex+1]="X";
				System.out.print(arr[row][col]);		
			}
			System.out.println();	
		}

	}

실습문제 10

class Array2Practice


	public void practice10() {
		Scanner sc = new Scanner(System.in);
		String[][] arr = new String[6][6];

		System.out.print("행 인덱스 입력 : ");	
		int rowIndex = sc.nextInt();	
		System.out.print("열 인덱스 입력 : ");
		int colIndex = sc.nextInt();		

		for (int row = 0; row < arr.length; row++) {		
			for (int col = 0; col < arr[row].length; col++) {

				if(row == 0 && col != 0) {
					arr[row][col] = col-1 + " ";
					// col-1 // Type mismatch: cannot convert from int to String
					// col-1 + " " // 오류 해결
				} else if(row!=0 && col==0) {
					arr[row][col] = row-1 + " ";
				} else {arr[row][col] = " ";
				}

				arr[rowIndex+1][colIndex+1]="X";
				System.out.print(arr[row][col]);		
			}
			System.out.println();	
		}

	}

실습문제 11

class Array2Practice


	public void practice11() {
		Scanner sc = new Scanner(System.in);

		String[][] arr = new String[6][6];

		while (true) {
			System.out.print("행 인덱스 입력 : ");	
			int rowIndex = sc.nextInt();	
			System.out.print("열 인덱스 입력 : ");
			int colIndex = sc.nextInt();

			if (rowIndex == 99) {
				System.out.println("프로그램 종료");
				break;
			}
			if(rowIndex != 99) {
				for (int row = 0; row < arr.length; row++) {		
					for (int col = 0; col < arr[row].length; col++) {
						if(row == 0 && col != 0) {
							arr[row][col] = col-1 + " ";
							// col-1 // Type mismatch: cannot convert from int to String
							// col-1 + " " // 오류 해결
						} else if(row!=0 && col==0) {
							arr[row][col] = row-1 + " ";
						} else {arr[row][col] = " ";
						}

						arr[rowIndex+1][colIndex+1]="X";

						System.out.print(arr[row][col]);
					}

					System.out.println();

				}

			}

		}
	}

💫선생님


	// String 2차원 배열 6행 6열을 만들고 행의 맨 위와 제일 앞 열은 각 인덱스를 저장하세요.
	// 그리고 사용자에게 행과 열을 입력 받아 해당 좌표의 값을 “X”로 변환해 2차원 배열을 출력하세요.

	public void practice11_teacher() {
		Scanner sc = new Scanner(System.in);

		String[][] arr = new String[6][6];

		for(int row=0; row<arr.length; row++) {
			for(int col=0; col<arr[row].length; col++) {

				if(row == 0 && col != 0) {
					arr[row][col] = col-1 + " ";

				} else if(row != 0 && col == 0) {
					arr[row][col] = row-1 + " ";

				} else {
					arr[row][col] = "  ";
				}
			}
		}
		System.out.print("행 인덱스 입력 : ");
		int rowIndex = sc.nextInt();

		while(true) {
			if (rowIndex == 99) {
				System.out.println("프로그램 종료");
				break;
			}
			System.out.print("열 인덱스 입력 : ");
			int colIndex = sc.nextInt();


			arr[rowIndex+1][colIndex+1] = "X";

			// 출력용 for문
			for(int row=0; row<arr.length; row++) {
				for(int col=0; col<arr[row].length; col++) {

					System.out.print(arr[row][col]);
				}
				System.out.println(); // 줄바꿈
			}
			System.out.print("\n행 인덱스 입력 >> ");
			rowIndex = sc.nextInt();
		} 
	}

빙고게임

class Array2Practice

	public void bingoGame() {
		Scanner sc = new Scanner(System.in);

		System.out.print("빙고판 크기 지정 : ");
		int bingoSize = sc.nextInt();
		sc.nextLine();
		int[] arr = new int[bingoSize*bingoSize];


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

			arr[i] = (int)(Math.random()*(bingoSize*bingoSize)+1);

			for (int j=0; j<i; j++){
				if(arr[i] == arr[j]){
					i--;
					break;
				}
			}
		}
		String bingo[][] = new String[bingoSize][bingoSize];
		int index = 0;



		for (int i = 0; i < bingoSize; i++) {
			for (int j = 0; j < bingoSize; j++) {
				bingo[i][j] = arr[index++] + "";
				System.out.print(bingo[i][j] + " ");
			}
			System.out.println();
		}

		System.out.println("=======빙고게임 시작==========");
		while (true) {
			System.out.print("정수를 입력하세요 : ");
			String intNum = sc.nextLine();

			boolean flag = true; // 검색된 값이 빙고판에 있는지 확인하기 위한 변수

			System.out.println();



			for (int i = 0; i < bingo.length; i++) {
				for (int j = 0; j < bingo[i].length; j++) {

					if((intNum).equals(bingo[i][j])){
						bingo[i][j]="★";
						flag = false; // 일치하는 값이 있을 경우
					}
					System.out.printf("%4s", bingo[i][j]);
				}
				System.out.println();
			}
			if(flag) { // 일치하는 값이 없을 경우
				System.out.println("잘못입력하셨습니다. 다시 입력하세요.");
				continue;
			}

			// 빙고판 크기에 따라
			// 빙고 기준이 되는 문자열 생성
			// ex) 5 * 5 크기 빙고 -> 한 줄이 "★★★★★" 이면 빙고

			String bingoLine = "";
			for (int i = 0; i < bingoSize; i++) {
				for (int j = 0; j < bingoSize; j++) {
					bingoLine += "★";
				}
			}

			// 빙고 검사
			int bingoCount = 0; // 빙고 수를 저장할 변수

			// 가로(행) 또는 세로(열)의 문자를 더하여 하나의 문자열로 저장
			// --> 저장된 문자열의 모양이 "★★★★★" 인 경우 == 빙고
			// --> bingoCount 증가
			String row="";
			String col="";

			for(int i=0; i<bingo.length; i++) {
				// 매 반복 시 마다 row, col을 빈 문자열로 초기화
				// --> 바깥쪽 for문이 반복될 때 마다 검사하는 행과 열이 이동하므로
				// 	   빙고 여부를 검사하기 위한 row, col을 빈 문자열로 초기화 해야함

				for(int j=0; j<bingo[i].length; j++) {
					row += bingo[i][j]; // 현재 행의 문자를 모두 더함
					col += bingo[i][j];
				}

				if(row.equals(bingoLine)) { // 가로 빙고가 존재할 경우 //[0][1], [0][2]
					bingoCount++;
				}
				if(col.equals(bingoLine)) { // 가로 빙고가 존재할 경우 //[0][1], [0][2]
					bingoCount++;
				}


			}
			// 대각선 빙고 여부
			// 대각선 : diagonal(다이애그널)

			// 대각선은 빙고판에 두개만 존재
			// --> 대각선 문자를 더해서 저장할 변수 두개 선언 및 빈문자열로 초기화
			String dia1 = "";
			String dia2 = "";

			// 대각선은 for문 하나로 가능
			for(int i=0; i<bingo.length; i++) {
				dia1 = dia1 + bingo[i][i]; // 좌상 우하
				dia2 = dia2 + bingo[i][bingo.length-1]; // 우상 좌하

			}
			if(dia1.equals(bingoLine)) {
				bingoCount++;
			}
			if(dia2.equals(bingoLine)) {
				bingoCount++;
			}
			// 빙고 카운트 출력
			System.out.println("현재" + bingoCount + "빙고");

			// 빙고 개수가 3개 이상인 경우

			if(bingoCount >= 3) {
				System.out.println("****** BINGO !! *******");
				break;
			}

		} // while 문 끝
	}
}

가변 배열

다차원 배열 생성 시 마지막 배열차수의 크기를 지정하지 않고 나중에 서로 크기가 다른 배열로 지정한 배열

  • 가변 배열 할당

가변 배열 구조

profile
Hello! My Name is oYJo

0개의 댓글