본문 바로가기

📚Study Note/JAVA

[ JAVA ] 배열 Array ② 배열의 배열(2차원 배열)

/*==========================================
 ■■■  배열(Array) ■■■
 - 배열의 선언과 초기화 
 - 배열의 기본적인 활용
 ===========================================*/

// ● 과제
// 사용자로부터 학생 수를 입력받고, 그 만큼의 점수(정수형태) 를 입력받아
// 전체 학생 점수의 합, 평균, 편차를 구하여 결과를 출력하는 프로그램을 구현한다.
// 단, 배열을 활용하여 처리할 수 있도록 한다.

// 실행 예)
// 학생 수 입력 : 5
// 1번 학생의 점수 입력 : 90
// 2번 학생의 점수 입력 : 82
// 3번 학생의 점수 입력 : 64
// 4번 학생의 점수 입력 : 36
// 5번 학생의 점수 입력 : 98

// >> 합    : 370
// >> 평균  : 74.0
// >> 편차 
// 90 : -16.0
// 82 : -8.0
// 64 : 10.0
// 36 : 38.0
// 98 : -24.0
// 계속하려면 아무 키나
import java.util.Scanner;
public class Test085
{
	public static void main(String[] args)
	{
		
		Scanner sc = new Scanner(System.in);
		
		//학생 수 담을 변수
		int students;

		//학생 수를 입력받는다
		System.out.print("학생 수 입력 : ");
		students = sc.nextInt();


		//학생 수만큼 배열에 메모리를 할당한다

		int[] arr = new int[students];


		//학생 수만큼 점수를 입력받고 배열을 초기화한다
		for (int i=0; i<arr.length; i++)
		{
			System.out.printf("%d번 학생의 점수 입력 : ",i+1);
			arr[i]=sc.nextInt();
		}

		System.out.println();//개행

		//합을 구한다
		int sum=0;

		for (int a=0; a<arr.length; a++)
		{
			sum +=arr[a];
		}
		//System.out.println(sum);


		//평균을 구한다
		double average;
		average = sum / arr.length;
		//System.out.println(average);

		
		//편차를 담을 배열을 선언, 메모리할당 한 다음 편차 값을 구해 배열에 담아낸다.
		
		double[] arr2 = new double[students];
		
		double deviation;
		for (int b=0; b<arr2.length; b++)
		{
			arr2[b] = average - arr[b];

		}


		//출력한다.
		System.out.printf(">> 합    : %d\n", sum);
		System.out.printf(">> 평균  : %.1f\n", average);
		System.out.println(">> 편차 ");
		

		for (int c=0; c<arr.length; c++)
		{
			System.out.printf("%d : %.1f\n", arr[c], arr2[c]);
		}



	}
}

/*학생 수 입력 : 5
1번 학생의 점수 입력 : 90
2번 학생의 점수 입력 : 82
3번 학생의 점수 입력 : 64
4번 학생의 점수 입력 : 36
5번 학생의 점수 입력 : 98

>> 합    : 370
>> 평균  : 74.0
>> 편차
90 : -16.0
82 : -8.0
64 : 10.0
36 : 38.0
98 : -24.0
계속하려면 아무 키나 누르십시오 . . .*/

 

 

 

 

 

 

 

다른 언어에서는 배열의 배열이라고 하지 않는다. 자바에서는 지금까지의 배열은 그냥 배열.
자바에서는 2차원 배열이라고 하기 보다는 엄밀히는 배열의 배열이라고 하는 것이 맞다. 어떤구조냐면 
변수 연결된 형태로 여러개로 구성해놨다. 0,1,2방 배열안에 들어있는 데이터 구조가
그 안에 또 3개의 방들이 들어가있는 상태. 이런형태 실행된다면 반복문과 마찬가지로 웅 숑숑숑 웅 숑숑숑
2차원의 경우에는 3차원과 다르게 사람들이 이해할수있는 능력이 크게 다르지 않기 때문에 
여러번 해보면서 익숙해지는 것이 가장 좋은 방법이다. 새 도구보다는 나에게 익숙한도구가 좋다 20년 쓴 달인의 망치,,,
여기까지는 익숙함과의 싸움이다. '누구는 이해하는데 나는 못해 이해가 늦나봐' 라기보다는
한번이라도 더 해보려고 해야 한다. 결과가 잘 나오는 사람은 재밌어서 더하게 됨.  그 반대의 경우
하기 싫어진다. 오류나고 그래서 빈부격차 생김 그렇게 안되게 합시다

/*==========================================
 ■■■  배열(Array) ■■■
  - 배열의 배열
 ===========================================*/



public class Test086
{
	public static void main(String[] args)
	{
		// 배열의 배열 선언과 초기화
		// 방법 ① 방법
		//int[] arr1 = new int[3];
		int[][] arr1 = new int[3][3];
			//인트 배열의 배열이다~~int[][] 이게 데이터타입이고 arr1은 변수이름
			//아까 그림판 배열 그림과 같다
			//3층건물이 있는데 한 층에 사무실이 3개씩 들어있는것이다 그러면 얘는 1층에 첫번째 사무실 1층 2번재 1층 3번째 2층에 1번째...
			//그런데 여기서도 이제 !!! 낯선 형태로 인덱스가 구성되는데
			// 0층 1층 2층 이렇게 부르고 각 호실도 0번째 1번째 2번째 이렇게 부른다 그러면 3층 2번째는 (2,1) 
			// (2,1)일때 두 번째 방에 첫번재방이라고생각하기 쉬운데 사실 3층의 2방이다.
		//arr1[0] = 1;
		/*arr1[0][0]=1;
		arr1[0][1]=2; 
		arr1[0][2]=3;
		arr1[1][0]=4;
		arr1[1][1]=5;
		arr1[1][2]=6;
		arr1[2][0]=7;
		arr1[2][1]=8;
		arr1[2][2]=9; */
			
		// 방법 ② 
		//int[] arr2 = {1,2,3}; //자바가 알아서 3개 방만들고 방에다가 하나씩 123 넣어준다.
		//int[][] arr2 = {{1,2,3},{4,5,6},{7,8,9}};

		// 방법 ③ 
		int[][] arr3 = new int[3][3];
		int n=1;

		//아래서 주목해야할것은 arr3.length 이다 → arr.length=3
		//그런데 arr의 첫번째 방의 길이도 3, 두번째방도 3, 3번째 3이다.
		for (int i=0; i<arr3.length; i++) // arr3.length == 3 이다 따라서 밖에서 웅~ 한번 하면 안에서 숑!숑!숑! 돌아야함(각 방에 조그만방이 3개씩이니까)
		{
			for (int j=0; j<arr3[i].length; j++) //arr3[i].length ==3 안에있는 조그만 방들의 길이 arr3[1].length와 arr3[2].length도 모두3 
			{
				arr3[i][j] = n;
				n++;
			}
		
		}
		
		// 배열의 배열 요소 전체 출력
		
		for (int i=0; i<arr3.length; i++)
		{
			for (int j=0; j<arr3[i].length; j++)
			{
				System.out.printf("%3d", arr3[i][j]);
			}
			System.out.println();
		}



	}

}

/*
  1  2  3
  4  5  6
  7  8  9
계속하려면 아무 키나 누르십시오 . . .*/

 

 

 

 

 

 

 

 

 

/*==========================================
 ■■■  배열(Array) ■■■
  - 배열의 배열(2차원 배열)
 ===========================================*/
// 배열의 배열 다차원 배열을 활용하여 다음과 같은 데이터를 요소로 취하는 배열(5*5)을
// 구성하고 그 결과를 출력하는 프로그램을 구현한다.

/* 실행 예


 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
계속하려면 아무 키나.... 
*/

public class Test087
{
	public static void main(String[] args)
	{
		
		//배열의 배열을 선언하고 메모리를 할당한다
		int[][] arr = new int[5][5];
		
		
		
		
		//'배열의 배열'을 구성한다. (배열을 초기화한다는 뜻)

		int n=1;
		
	    for (int i=0; i<arr.length; i++) //i →0 1 2 3 4 (총 5회 반복)
	    {
			for (int j=0; j<arr[i].length; j++)//i가 0일 때 01234/.../i가 4일때 01234
			{
				arr[i][j] = n;
				n++;
			}
	    }



		//'배열의 배열 요소'를 전체 출력한다.

	    for (int i=0; i<arr.length; i++)
	    {
			for (int j=0; j<arr[i].length; j++)
			{
				System.out.printf("%3d",arr[i][j]);
			}
			System.out.println();
	    }
		//System.out.println();

		// +약간 여담 : 여기서 개행하는 위치들 
		//위에 있는 System.out.println();은 웅~하고 개행하는거고
		//아래 주석처리한 System.out.println(); 은 웅 숑숑숑을 다섯번 다 수행한 후에
		//개행하는 것이다. 개행 코드 위치에 따라서 어디서 개행이 되는지 파악하고 있어야 한다.

	}

}
/*
  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
계속하려면 아무 키나 누르십시오 . . .

*/

 

 

 

 

 

 

 

 

/*==========================================
 ■■■  배열(Array) ■■■
  - 배열의 배열(2차원 배열)
 ===========================================*/


// 배열의 배열 다차원 배열을 활용하여 다음과 같은 데이터를 요소로 취하는 배열(5*5)을
// 구성하고 그 결과를 출력하는 프로그램을 구현한다.

/* 실행 예

                            j=0 j=1  j=2  j=3  j=4
 1  2  3  4  5        → i=0  ____________________
 2  3  4  5  6        → i=1  ____________________ 
 3  4  5  6  7        → i=2  ______<i + j+1>_____
 4  5  6  7  8        → i=3  ____________________
 5  6  7  8  9        → i=4  ____________________
 계속하려면 아무 키나....
*/

//Test87번의 문제와 똑같지만 배열에 담긴 숫자(배열의 배열 요소)들이 다르다 . 그래서 87번 풀이를
//복붙한 다음에 <배열의 배열을 초기화> 하는 과정만 변화를 주었다 (아래 ♣♣♣♣♣ 표시한 부분!!!!)


public class Test088
{
	public static void main(String[] args)
	{
		//배열의 배열을 선언하고 메모리를 할당한다
		int[][] arr = new int[5][5];



		
		
		
		
		//'배열의 배열'을 구성한다. (배열을 초기화한다는 뜻)

		
	    for (int i=0; i<arr.length; i++) //i →0 1 2 3 4 (총 5회 반복)
	    {
			for (int j=0; j<arr[i].length; j++)//i가 0일 때 01234/.../i가 4일때 01234
			{
				
				//♣♣♣♣♣
				arr[i][j] = i+ j+1;   
			 
                // i와 j로 담길 수(요소들)를 만들어낼 수 있으니 
				// 앞서 87번에서 필요했던 변수 n(n++ 하며 더해갔던)이 더 이상 필요하지 않다.

			}
	    }



		//'배열의 배열 요소'를 전체 출력한다.

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


	}
}

/*
  1  2  3  4  5
  2  3  4  5  6
  3  4  5  6  7
  4  5  6  7  8
  5  6  7  8  9
계속하려면 아무 키나 누르십시오 . . .*/

 

 

 

 

 

 

 

 

 

★  이 문제의 경우 생각을 좀 해봐야 한다. 

/*==========================================
 ■■■  배열(Array) ■■■
  - 배열의 배열(2차원 배열)
 ===========================================*/

// 배열의 배열 다차원 배열을 활용하여 다음과 같은 데이터를 요소로 취하는 배열(5*5)을
// 구성하고 그 결과를 출력하는 프로그램을 구현한다.

/* 실행 예

                         
 1  2  3  4  5       
 5  1  2  3  4         
 4  5  1  2  3       
 3  4  5  1  2
 2  3  4  5  1
 계속하려면 아무 키나....
*/


public class Test089
{
	public static void main(String[] args)
	{
		//배열의 배열을 선언하고 메모리를 할당한다
		int[][] arr = new int[5][5];
		
		
		
		//'배열의 배열'을 구성한다. (배열을 초기화한다는 뜻)

		
		
	    for (int i=0; i<arr.length; i++)  // i → 0 1 2 3 4   i가 하는 역할은 가로 한 줄씩 처리하려는 목표를 가지고 있다 
	    {
			for (int j=i, n=1; n<=5; n++) // n → 12345 /12345
			{
				arr[i][j] = n;   // 0 → 00=1 / 01=2 /02=3/ 03=4/ 05=5
								 // 1 → 11=1 / 12=2/ 13=3/ 14=4/ (15=5 ▶ 10=5) 따라서 위치가 맨앞으로 감	
								 // 2 → 22=1 / 23=2 / 24=3 / 20=4 / 21=5 
				j++;
				if (j==5)
					j=0;
			
			}
	    }		

		//'배열의 배열 요소'를 전체 출력한다.

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

/*
  1  2  3  4  5
  5  1  2  3  4
  4  5  1  2  3
  3  4  5  1  2
  2  3  4  5  1
계속하려면 아무 키나 누르십시오 . . .
*/

 

 

 

 

 

import java.util.Scanner;
import java.util.Random;
public class Test090
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);

		System.out.print("발생시킬 난수의 갯수 입력 : ");
		int size = sc.nextInt();
		
		//배열 선언 및 메모리 할당
		int[] arr = new int[size];

	
		
		// 난수를 발생하게 해주는 class Random(원래는 Math라는 클래스로 0부터 1사이 실수의 난수 줬었음)
		// 무작위 숫자(난수)를 발생시키기 위해서는 난수 발생 전용 객체가 필요하다
		// → java.util.Random; import 해줘야 한다.
		Random rd = new Random();
		// 그런데 rd.nextInt(100); 이렇게 하면 0에서 99! 까지의 난수가 발생한다. 
		// 그러면 1부터 100까지의 난수를 받기 위해서는 rd.nextint(100) +1
		System.out.println("발생한 난수 : " + rd.nextInt(100)); 
		
		//이 nextInt는 Random클래스 내부의 메소드로, Scanner클래스의 그것과는 구분이 된다(이름은 같지만)

	
		for (int i =0; i<size; i++) // for (int i =0; i<arr.length; i++)
		{
			arr[i] = rd.nextInt(100) +1;
			System.out.printf("%4d", arr[i]);
		}
		System.out.println();
		// 가장 큰 값과 작은 값을 담을 변수
	    int max, min;
		max = min = arr[0]; //max = min =79

	
		for (int i =1; i<arr.length; i++) //★여기서 i=1이어야 하는 이유 : 첫번째값은 비교할 필요가없으니까
		{
			//max  i번째 요소의 크기 비교  → max가 더 크면 냅두고 i가 더 크면 i로 값을 갱신한다.
			if (max< arr[i])
			{
				max = arr[i];
			}
			if (min > arr[i])
			{
				min = arr[i];
			}
		
			
			
			//min 과 i번째 요소의 크기 비교 → min이 작으면 냅두고 i가 더 작으면 값을 갱신한다.
		
		}



	
		// 결과 출력
		System.out.printf("가장 큰 값 : %d, 가장 작은 값 : %d\n", max, min);
		
	
	
	}


}