자바/기본적인 개념

다차원 배열

백_곰 2021. 1. 5. 13:10

1. 2차원 배열의 초기화

 

 

2. 2차원 배열에서의 length?

- 2차원 배열 변수가 참조하고 있는 곳이 행이기에, 행의 갯수가 나오게 된다.

(ex: arr.length)

 

- 열의 갯수는 해당 행의 길이를 가지고 쓰면 된다.

(ex: arr[0].length)

 

 

 

3. 2차원 배열의 길이를 이용하여 초기화하는 방법

 

 

 

4. 2차원 배열들을 향상된 for문을 통해서 합계 구하기.

 

 

5. 예제(1) - 좌표에 X 표하기.

import java.util.Scanner;

public class Exercise001 {	
	public static void main(String[] args) {
		final int SIZE = 10;
		int x = 0, y = 0;

		char[][] board = new char[SIZE][SIZE];
		board[0][0] = ' ';
		byte[][] shipBoard = {
		  //  1  2  3  4  5  6  7  8  9
			{ 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1
			{ 1, 1, 1, 1, 0, 0, 1, 0, 0 }, // 2
			{ 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 3
			{ 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 4
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 5
			{ 1, 1, 0, 1, 0, 0, 0, 0, 0 }, // 6
			{ 0, 0, 0, 1, 0, 0, 0, 0, 0 }, // 7
			{ 0, 0, 0, 1, 0, 0, 0, 0, 0 }, // 8
			{ 0, 0, 0, 0, 0, 1, 1, 1, 0 }, // 9
		};
		
		for(int i=0; i<SIZE; i++) {
			for(int j=0; j<SIZE; j++) {
				board[i][j] = ' ';
			}
		}

	     // 0행에 행번호를, 0열에 열번호를 저장한다. 
		for(int i=1;i<SIZE;i++)
			board[0][i] = board[i][0] = (char)(i+'0');

		Scanner scanner = new Scanner(System.in);

		while(true) {
			System.out.printf("좌표를 입력하세요.(종료는 00)>");
			String input = scanner.nextLine(); // 화면입력받은 내용을 tmp에 저장

			if(input.length()==2) {   // 두 글자를 입력한 경우
				x = input.charAt(0) - '0';  // 문자를 숫자로 변환
				y = input.charAt(1) - '0';

				if(x==0 && y==0) // x와 y가 모두 0인 경우 종료
					break; 
			} 
			
			if(input.length()!=2 || x <= 0 || x >= SIZE || y <= 0 || y >= SIZE){
				System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
				continue;
			}

			// shipBoard[x-1][y-1]의 값이 1이면, 'O'을 board[x][y]에 저장한다.  
			board[x][y] = shipBoard[x-1][y-1]==1 ? 'o' : 'x';  
			
			// 배열 board의 내용을 화면에 출력한다.
			for(int i=0;i<SIZE;i++) {
				for(int j=0;j<SIZE;j++) {
					System.out.printf("%c", board[i][j]);
				}
				System.out.println();
			}
			System.out.println();
		}
	} // main의 끝
}

( 처음 2차원 char 배열을 ' ' 공백을 초기화한 후, 출력해야 한다. )

 

 

 

6. 예제(2) - 빙고판 만들어보기.

import java.util.Scanner;

public class Exercise001 {	
	public static void main(String[] args) {
		final int SIZE = 5;
		int x = 0 , y = 0;
		int num = 0;

		int[][] bingo = new int[SIZE][SIZE];
		Scanner scanner = new Scanner(System.in);

		// 배열의 모든 요소를 1부터 SIZE*SIZE까지의 숫자로 초기화
		for(int i=0;i<SIZE;i++) {
			for(int j=0;j<SIZE;j++) {
				bingo[i][j] = i*SIZE + j + 1;
			}
		}

		// 배열에 저장된 값을 뒤섞는다.(shuffle)
		for(int i=0;i<SIZE;i++) {
			for(int j=0;j<SIZE;j++) {
				x = (int)(Math.random() * SIZE);
				y = (int)(Math.random() * SIZE);

				// bingo[i][j]와 임의로 선택된 값(bingo[x][y])을 바꾼다.
				int tmp =  bingo[i][j];
				bingo[i][j] = bingo[x][y];
				bingo[x][y] = tmp;
			}
		}

		do {
			for(int i=0;i<SIZE;i++) {
				for(int j=0;j<SIZE;j++)
					System.out.printf("%2d ", bingo[i][j]);	
				System.out.println();
			}
			System.out.println();
		
			System.out.printf("1~%d의 숫자를 입력하세요.(종료:0)>", SIZE*SIZE);
			String tmp = scanner.nextLine(); // 화면에서 입력받은 내용을 tmp에 저장
			num = Integer.parseInt(tmp);     // 입력받은 문자열(tmp)를 숫자로 변환

			// 입력받은 숫자와 같은 숫자가 저장된 요소를 찾아서 0을 저장
			outer:
			for(int i=0;i<SIZE;i++) {
				for(int j=0;j<SIZE;j++) {
					if(bingo[i][j]==num) {
						bingo[i][j] = 0;
						break outer; // 2중 반복문을 벗어난다.
					}
				}
			}
		} while(num!=0); 
	} // main의 끝
}

 

 

 

7. 예제(3) - 행렬곱 구현해보기.

import java.util.Scanner;

public class Exercise001 {	
	public static void main(String[] args) {
		int[][] m1 = {
				{1, 2, 3},
				{4, 5, 6}
			};

			int[][] m2 = {
				{1, 2},
				{3, 4},
				{5, 6}
			};

			final int ROW    = m1.length;      // m1의 행길이
			final int COL    = m2[0].length;  // m2의 열길이
			final int M2_ROW = m2.length;	    // m2의 행길이

			int[][] m3 = new int[ROW][COL];

		   // 행렬곱 m1 x m2의 결과를 m3에 저장
			for(int i=0;i<ROW;i++)
				for(int j=0;j<COL;j++)
					for(int k=0;k<M2_ROW;k++)
						m3[i][j] += m1[i][k] * m2[k][j]; 

		   // 행렬 m3를 출력 
			for(int i=0;i<ROW;i++) {
				for(int j=0;j<COL;j++) {
					System.out.printf("%3d ", m3[i][j]);
				}
				System.out.println();
			}
	} // main의 끝
}