본문 바로가기

Java 웹 개발

21.08.27 - 웹 개발 입문 13일차

2차원, 3차원 등 높은 차원의 배열의 사용

0차원(점의 형태를 가진 데이터)
int a = 10;

1차원(선의 형태를 가진 데이터)
int[] b = new int[] { 10, 20, 30 };

2차원(면의 형태를 가진데이터)
int[][] c = new int[][] {
{10, 20, 30},
{40, 50, 60}
};

3차원(입체의 형태를 가진 데이터)
int[][][] d = new int[][][] {

 

 

 

2차원 배열의 필요성
ex : 3개반에서 각 3명의 학생에 대한 성적 정보
- 0차원 : 변수 9개 (9명의 성적 정보)
- 1차원 : 1차원배열 3개 (3개반의 성적 정보)
- 2차원 : 2차원배열 1개 (1개 학년의 성적 정보)

package array2d;

public class Test03 {

	public static void main(String[] args) {

		// 생성
		int[][] score = new int[][] { 
			{ 70, 80, 80 }, 
			{ 60, 90, 50 }, 
			{ 100, 80, 40 } 
		};

		//(score) -----> 	(+0) 	-----> 	[ 70 ] [ 80 ] [ 80 ] 
		//							(+1) 	----->	[ 60 ] [ 90 ] [ 50 ]
		//							(+2) 	----->	[ 100 ] [ 80 ] [ 40 ]

		//출력
		for(int i = 0 ; i < score[0].length ; i++) {
			System.out.print(score[0][i]);
			System.out.print("\t");
		}
		System.out.println();

		for(int i = 0 ; i < score[1].length ; i++) {
			System.out.print(score[1][i]);
			System.out.print("\t");
		}
		System.out.println();

		for(int i = 0 ; i < score[2].length ; i++) {
			System.out.print(score[2][i]);
			System.out.print("\t");
		}
		System.out.println();
	}
}

- 정답

70 80 80
60 90 50
100 80 40

 

 

출력 부분 더 간단하게 표현하기

package array2d;

public class Test04 {

	public static void main(String[] args) {

		// 생성
		int[][] score = new int[][] { 
			{ 70, 80, 80 }, 
			{ 60, 90, 50 }, 
			{ 100, 80, 40 } 
		};

		//(score) -----> 	(+0) 	-----> 	[ 70 ] [ 80 ] [ 80 ] 
		//							(+1) 	----->	[ 60 ] [ 90 ] [ 50 ]
		//							(+2) 	----->	[ 100 ] [ 80 ] [ 40 ]

		//출력
		//for(int k = 0 ; k <= 2 ; k++) {
		//for(int k = 0 ; k < 3 ; k++) {
		for(int k = 0 ; k < score.length ; k++) {
			for(int i = 0 ; i < score[k].length ; i++) {
				System.out.print(score[k][i]);
				System.out.print("\t");
			}
			System.out.println();
		}

	}
}

 

 

Q.  5 X 5  배열 위치를 기준으로 구현해보기

package array2d;

public class Test5_1 {
	public static void main(String[] args) {
		// 배열 생성
		int[][] data = new int[5][5];// 5칸짜리 1차원배열을 5개 묶었다 = 5줄 5칸

		// 초기화 : 위치를 기준으로 반복하며 값을 초기화
		//= [0][0] 부터 [4][4] 까지 데이터를 추가
		int count = 1;
		for (int i = 0; i < data.length; i++) {
			for (int k = 0; k < data[i].length; k++) {
				System.out.println(i+"번 줄 , "+k+"번 칸에 "+count+"를 대입합니다");
				//data[i][k] = 5 * i + k + 1;
				data[i][k] = count;
				count++;
			}
		}

		// 출력
		for (int i = 0; i < data.length; i++) {// 줄반복
			for (int k = 0; k < data[i].length; k++) {// 칸반복
				System.out.print(data[i][k]);
				System.out.print("\t");
			}
			System.out.println();
			System.out.println();
		}
	}
}

 

Q.  5 X 5  배열 값을 기준으로 구현해보기

package array2d;

public class Test5_2 {
	public static void main(String[] args) {
		// 배열 생성
		int[][] data = new int[5][5];// 5칸짜리 1차원배열을 5개 묶었다 = 5줄 5칸

		// 초기화 : 값을 기준으로 반복하며 초기화
		//= 1부터 25까지 데이터를 추가
		int count = 1;
		int x = 0 , y = 0;
		for(int i = 1 ; i <= 25 ; i ++) {
			System.out.println(x+"번 줄 , "+y+"번 칸에 "+i+"를 대입");
			data[x][y] = i;
			y++;
			if(y >= 5) {//삐져나가면
				//다음줄로 이동 처리
				x++;
				y = 0;
			}
		}

		// 출력
		for (int i = 0; i < data.length; i++) {// 줄반복
			for (int k = 0; k < data[i].length; k++) {// 칸반복
				System.out.print(data[i][k]);
				System.out.print("\t");
			}
			System.out.println();
			System.out.println();
		}
	}
}

- 정답

0번 줄 , 0번 칸에 1를 대입
0번 줄 , 1번 칸에 2를 대입
0번 줄 , 2번 칸에 3를 대입
0번 줄 , 3번 칸에 4를 대입
0번 줄 , 4번 칸에 5를 대입
1번 줄 , 0번 칸에 6를 대입
1번 줄 , 1번 칸에 7를 대입
1번 줄 , 2번 칸에 8를 대입
1번 줄 , 3번 칸에 9를 대입
1번 줄 , 4번 칸에 10를 대입
2번 줄 , 0번 칸에 11를 대입
2번 줄 , 1번 칸에 12를 대입
2번 줄 , 2번 칸에 13를 대입
2번 줄 , 3번 칸에 14를 대입
2번 줄 , 4번 칸에 15를 대입
3번 줄 , 0번 칸에 16를 대입
3번 줄 , 1번 칸에 17를 대입
3번 줄 , 2번 칸에 18를 대입
3번 줄 , 3번 칸에 19를 대입
3번 줄 , 4번 칸에 20를 대입
4번 줄 , 0번 칸에 21를 대입
4번 줄 , 1번 칸에 22를 대입
4번 줄 , 2번 칸에 23를 대입
4번 줄 , 3번 칸에 24를 대입
4번 줄 , 4번 칸에 25를 대입
1    2  3  4   5 

6    7  8  9  10

11 12 13 14 15

16 17 18 19 20

21 22 23 24 25

 

 

 

Q. 다음 형태로 배열을 초기화하고 표 모양으로 구현해보기

1 6 11 16 21

2 7 12 17 22

3 8 13 18 23

4 9 14 19 24

5 10 15 20 25

 

package array2d;

public class Test06 {
	public static void main(String[] args) {
		// 입력(준비)
		int[][] data = new int[5][5];

		int count = 1;
		for (int i = 0; i < data.length; i++) {
			for (int k = 0; k < data[i].length; k++) {
				// System.out.println("i = " + i + ", k = " + k);
				// System.out.println("k = " + k + ", i = " + i);

				// data[k][i] = count;
				// count++;

				// data[k][i] = ++count;//count를 1 증가 시킨 뒤 대입(증가를 제일 처음, 전위증가연산)
				data[k][i] = count++;// count를 대입한 뒤 1 증가 시킴(증가를 제일 마지막, 후위증가연산)
			}
		}

		// 출력
		for (int i = 0; i < data.length; i++) {
			for (int k = 0; k < data[i].length; k++) {
				System.out.print(data[i][k]);
				System.out.print("\t");
			}
			System.out.println("\n");
		}
	}
}

 

 

Q. 다음 형태로 배열을 초기화하고 표 모양으로 구현해보기

1   2   3   4  5

10  9   8   7  6

11 12 13 14 15

20 19 18 17 16

21 22 23 24 25

 

package array2d;

public class Test07 {
	public static void main(String[] args) {
		// 배열 생성
		int[][] data = new int[5][5];

		int count = 1;
		for (int i = 0; i < data.length; i++) {
			for (int k = 0; k < data[i].length; k++) {
				if (i % 2 == 0) { // 짝수 줄
//					System.out.println(i + " " + k);
					data[i][k] = count++;
				} else { // 홀수 줄
					int t = data[i].length - 1 - k;
					data[i][t] = count++;
//					System.out.println(i + " " + (data[i].length - 1 - k));
				}
			}

		}

		// 출력
		for (int i = 0; i < data.length; i++) {// 줄반복
			for (int k = 0; k < data[i].length; k++) {// 칸반복
				System.out.print(data[i][k]);
				System.out.print("\t");
			}
			System.out.println();
			System.out.println();
		}
	}
}

 

 

 

Q. 5x5 숫자 중복 없이 빙고판 만들기
빙고판은 무조건 정사각형이어야 한다.

(length가 사용하기 불편하므로 크기와 관련된 변수를 만들어 사용)

package array2d;

import java.util.Random;

public class Test08 {

	public static void main(String[] args) {

		//입력
		int size = 5;
		int[][] map = new int[size][size];

		//처리
		//1. (0,0)부터 (4,4)까지 1~25 사이의 랜덤값을 대입 - 위치 기준
		//2. 1부터 25까지의 값을 순서대로 랜덤한 위치에 대입 - 값 기준
		Random r = new Random();
		for(int i=1; i <= size*size; i++) {
			int x = r.nextInt(size);//0부터 size개;
			int y = r.nextInt(size);//0부터 size개;
			//System.out.println(i+"값을 ("+x+", "+y+") 위치에 대입");

			//if(한번도 값을 넣은 적 없는 칸이라면) {
			if(map[x][y] == 0) {
				map[x][y] = i;
			}
			else {
				//위치를 다시 뽑아라(다음 회차로 진행하지 못하도록 반복변수 i를 제자리로 설정)
				i--;
			}
		}

		//출력
		for(int i=0; i < size; i++) {
			for(int k=0; k < size; k++) {
				System.out.print(map[i][k]);
				System.out.print("\t");
			}
			System.out.println("\n");
		}
	}
}

- 정답

18  5  8  2  7

24 22 14 9 10

11 19 20 1 23

17 12 6 21 4

16 13 15 25 3