작성 : 2024. 4. 6. 13:49

 

자동 import : Command + Shift + o

배열을 이용한 프로그램 알아보기

배열의 복사 :

ex) arr1 → arr2 옮기기

  1. 반복문
  2. 메소드
// 반복문을 이용

배열의 한 자리 복사하는 코드:


//    (배열의 선언 = 초기화 방법들)
//		int[] arr1;  // 배열의 선언
// 		arr1 = new int[5];  // [] 안에다 배열의 크기를 정해 주기, 위와 세트
// 		int[] arr1 = {10, 20, 30, 40, 50};  // 안에 어떤 값이 있는지까지 정해 한번에 선언하는 방법

배열 선언 후 

for (int i = 0; i < arr1.length; i++) {
 arr1[i] = arr2[i];
}


배열의 여러 자리 복사하는 코드:

배열 선언 후

for (int i = 0; i < 3; i++) {
 arr2[i + 2] = arr1[i];
}


잘 들어갔는지 확인하기 위해 배열에 숫자를 넣어 실행해봄.

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

배열의 한 자리 복사하는 코드:

 		int[] arr1 = {10, 20, 30, 40, 50};
 		int[] arr2 = {1, 2, 3, 4, 5};
		
 		for (int i = 0; i < arr1.length; i++) {
 			 arr1[i] = arr2[i];
 			}
 			
 		System.out.println(Arrays.toString(arr1));
 		System.out.println(Arrays.toString(arr2));


결과 :

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
-------------------------------------------------------------------------------
 
 배열의 여러 자리 복사하는 코드:
 		
 		for (int i = 0; i < 3; i++) {
 			 arr2[i + 2] = arr1[i];
 			}
 			
 	  System.out.println(Arrays.toString(arr1));
 		System.out.println(Arrays.toString(arr2));
 		
 			
결과 :

[10, 20, 30, 40, 50]
[1, 2, 10, 20, 30]
 		
 		
 		
 		// 강사님의 예시
		
		
		
		int[] arr1 = {1, 2, 3, 4, 5};
		int[] arr2 = new int[5];
 		
		for(int i = 0; i < 3; i++) {
			arr2[ i + 2 ] = arr1[i];
		}
		
		System.out.println(Arrays.toString(arr1));
 		System.out.println(Arrays.toString(arr2));
 		
결과 :

[1, 2, 3, 4, 5]
[0, 0, 1, 2, 3]



--------------------------------------------------------------------------------
    
    // 메서드를 이용한 배열의 복사 01.

    int[] arr1 = {1, 2, 3, 4, 5};
		int[] arr2 = new int[5]; 		
		
		System.arraycopy(arr1, 0, arr2, 2, 3);  
		// arraycopy (값을 가진 배열, 인덱스값, 값을 복사할 배열, 인덱스값, 크기)  
		System.out.println(Arrays.toString(arr2));
		
		
		결과 :
		
		[0, 0, 1, 2, 3]
		
--------------------------------------------------------------------------------		
	
		// 메소드를 이용한 배열의 복사 02.
	
		// arraycopy (값을 가진 배열, 인덱스값, 값을 복사할 배열, 인덱스값, 크기)
		
		System.arraycopy(arr1, 0, arr2, 0, arr1.length); //전체 복사
		System.out.println(Arrays.toString(arr2));
		
--------------------------------------------------------------------------------			
		
		// 메소드를 이용한 배열의 복사 03.
		
		// Arrays 객체 사용
		// copyof() 사용
		
		arr2 = Arrays.copyOf(arr1, 3);  // ( 위치, 몇 개 복사하고 싶은지 )
		System.out.println(Arrays.toString(arr2));
		
		
		// copyofRange() 사용
		
		arr2 = Arrays.copyOfRange(arr1, 2, 5);  
		// ( 위치, 시작인덱스 , 종료인덱스 (마지막은 포함이 안되기 때문에 포함하는 값 + 1 하기))
		System.out.println(Arrays.toString(arr2));
		
--------------------------------------------------------------------------------			
		
		
		값교환하는 방법
		// 'temp (동일한 타입)' 라는 임시저장공간에 옮겨줌. 
		
		int temp;
		int x = 10;
		int y = 20;
		
		System.out.println(x + ", " + y);
		
		temp = x;
		x = y;
		y = temp;
		
		System.out.println(x + ", " + y);
		
		결과 :
		
		10, 20
    20, 10
    
    
    
    중첩반복문 사용
    
    // 값을 오름차순으로 정렬하기

		int[] arr1 = { 2, 7, 3, 5, 1 };

		for (int i = 0; i < (arr1.length - 1); i++) { // (arr1.length - 1) 총 돌아야하는 횟수
			for (int j = (i + 1); j < arr1.length; j++) { // i와 비교하는 값 j
				int temp;
				if (arr1[i] > arr1[j]) {
					temp = arr1[i];
					arr1[i] = arr1[j];
					arr1[j] = temp;
				}
			}
		}

		System.out.println(Arrays.toString(arr1));
		
		결과 :
		
		[1, 2, 3, 5, 7]
		
		
		// 내림차순 정렬
		
		for (int i = 0; i < (arr1.length - 1); i++) {
			for (int j = (i + 1); j < arr1.length; j++) {
				int temp;
				if (arr1[i] < arr1[j]) {
					temp = arr1[i];
					arr1[i] = arr1[j];
					arr1[j] = temp;
				}
			}
		}
		
		System.out.println(Arrays.toString(arr1));
		
		결과 :
		
		[7, 5, 3, 2, 1]
		
		
		
		// Arrays.sort 를 이용해 오름차순 정렬
		
		Arrays.sort(arr1);
		System.out.println(Arrays.toString(arr1));
		
		결과 :
		
		[1, 2, 3, 5, 7]
		
		
		// Arrays.sort, Collections.reverseOrder 를 이용한 내림차순 정렬
		
		// 이때는 int 사용 불가 
		Integer[] arr2 = { 2, 7, 3, 5, 1 };
		
		Arrays.sort(arr2,Collections.reverseOrder());
		System.out.println(Arrays.toString(arr2));
		
		결과 :
		
		[7, 5, 3, 2, 1]

 

 

  • 2차원 배열

이상은 거의 쓰지 않음

행렬의 구조

// 2차원 배열
    // 행열의 구조 = 표의 형태
    // 행 = 세로, 열 = 가로
    
    //int[][] arr1; // 배열의 선언
    //arr1 = new int[5][3];  // 배열의 생성, [행][열] = [행] * [열] = 15의 인덱스를 가진 배열
		
		
		int[][] arr1 = new int[5][3];    // 한번에 선언과 생성
		
		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;
		
		arr1[4][0] = 13;
		arr1[4][1] = 14;
		arr1[4][2] = 15;
		
		// 이렇게 찍어보면 해당 위치에 있는 인덱스의 번호가 나옴.
		System.out.println(arr1[0][0]);
	  System.out.println(arr1[4][2]);
​

​

	// 문제 : 행의 크기가 2 이고 열의 크기가 5 인 이차원배열을 생성해라
	// 1부터 10까지 반복문을 사용해서 초기화한다
	// 홀수만 출력한다


// 풀이 1번 -> for문을 이용한 초기화가 아님

	int[][] arr1 = { // 선언 생성 초기화 동시에
			{ 1, 2, 3, 4, 5 }, // 한 행이 만들어짐
			{ 6, 7, 8, 9, 10 }, };

	for (int i = 0; i < arr1.length; i++) {
		for (int j = 0; j < arr1[0].length; j++) {
			if (arr1[i][j] % 2 != 0) {
				System.out.print(arr1[i][j] + " ");
			}
		}
	}
	
	
	// 풀이 2번
	
	int[][] arr1 = new int[2][5];

		for (int i = 0; i < arr1.length; i++) {
			for (int j = 0; j < arr1[0].length; j++) {
				arr1[i][j] = i * 5 + j + 1;
				if (arr1[i][j] % 2 == 1) {
					System.out.print(arr1[i][j] + " ");
				}
			}
		}

//		// deepToString 이차원 배열에서 출력
//		System.out.println(Arrays.deepToString(arr1));

결과 :

1 3 5 7 9 

// 결과는 둘 다 잘 나옴..

 

  • 배열을 초기화 한다는 것은?

배열을 초기화한다는 것은 배열의 각 요소에 값을 할당하거나 설정하는 것을 말합니다. 즉, 배열을 사용하기 전에 각 요소에 대해 값을 설정하는 것입니다. 배열을 선언하면 메모리에 공간이 할당되지만, 그 안의 각 요소는 초기화되지 않은 상태입니다. 이 때, 초기화를 수행하여 각 요소에 값을 설정해야 배열을 사용할 수 있습니다.

예를 들어, int 타입의 배열을 초기화한다고 할 때, 각 요소에는 정수 값이 할당됩니다. 자바에서는 배열을 선언한 후에 각 요소를 초기화하는 과정이 필요합니다. 이는 반복문이나 직접적인 할당을 통해 이루어집니다. 이것이 배열을 초기화한다는 개념입니다.

-GPT 참조..

 

 

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

public class Bingo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		// 변수 <-> 상수 (상반된 개념)

//		int x;
//		x = 10;
//		x = 20;   // 변수는 계속 변할 수 있음. 
//		
//		// 상수는 final 를 쓰고 상수명을 대문자로 씀
//		final double PI = 3.14; // 상수는 변하지 않는 수, 상수선언을 한 것임. 
//		
//		System.out.println(PI);

		// 빙고게임 만들기
		// 가로 세로 5 X 5

		final int SIZE = 5; // 상수선언
		int x = 0, y = 0;
		int num = 0; // 입력받은 값을 가지고 판단하는 역할

		int[][] bingo = new int[SIZE][SIZE]; // 상수를 사용해서 이차원배열 만들기

		Scanner sc = new Scanner(System.in);

		// 빙고판 초기화
		for (int i = 0; i < bingo.length; i++) {
			for (int j = 0; j < bingo[i].length; j++) {
				// ********  bingo[i][j] 이 위치의 인덱스에 들어갈 값이 나오는 식이 'i * SIZE + j + 1'이다!
				// 잘 모르겠으면 표를 그려보기!
				bingo[i][j] = i * SIZE + j + 1;  
			}
		}

//		System.out.print(Arrays.deepToString(bingo));   // 1 ~ 25 까지 나옴

		// 빙고게임을 만들기 위해 숫자들의 위치를 바꿔야 함. 위치값 자체를 난수로 만들어야 한다.
		// 랜덤

		// 빙고판 랜덤값으로 섞기
		for (int i = 0; i < SIZE; i++) {
			for (int j = 0; j < SIZE; j++) {
				x = (int) (Math.random() * SIZE); // 0 ~ 4 크기의 인덱스에 SIZE * SIZE 까지의 랜덤값을 넣어라
				y = (int) (Math.random() * SIZE);

				// 교환
				int temp = bingo[i][j]; // 빈 자리에 수를 넣어줌
				bingo[i][j] = bingo[x][y];
				bingo[x][y] = temp;

			}
		}

//		System.out.println(Arrays.deepToString(bingo));

		// 5 x 5 빙고판을 화면에 출력해보기

		// for 문으로 표현
//		for (int i = 0; i < SIZE; i++) {
//			for (int j = 0; j < SIZE; j++) {
//				System.out.print(bingo[i][j] + " ");
//			}
//			System.out.println();
//		}

		// arr 배열
		// arr[] 행 -> 이렇게 나누는 이유는 실제 이차원배열에서 참조방식이 행 따로, 열 따로 이기 때문.
		// arr[][] 행렬

		// 향상된 for문 : 편하고 오류를 방지할 수 있다.
		// int[] , int 는 타입, []는 행
		
		
		// 빙고 게임 진행

		do {

			for (int[] a : bingo) {
				for (int n : a) {
					System.out.print(n + " ");
				}
				System.out.println();
			}
			System.out.println();

			System.out.printf("1 ~ %d 의 숫자를 입력하세요. (종료 : 0) > ", SIZE * SIZE);

			// 값을 입력받는 곳
			num = sc.nextInt();

			boolean flag = true;

			// 빙고 안에 들어있는 숫자와 입력받은 숫자가 같은지 보고 같으면 0을 넣어줘라.
			// 입력받은 값이 0이면 멈춰라!
			for (int i = 0; i < SIZE; i++) {
				for (int j = 0; j < SIZE; j++) {
					if (bingo[i][j] == num) {
						bingo[i][j] = 0;
						flag = false;
						break;
					}
				}

				if (!flag) {
					break;
				}
			}
			
			// 빙고인지 체크해주기

			int sum = 0;
			flag = true;

			for (int i = 0; i < SIZE; i++) {
				sum = 0;
				for (int j = 0; j < SIZE; j++) {
					sum += bingo[i][j];
				}

				if (sum == 0) {
					flag = false;
					break;
				}
			}
			
			// 위 조건이 만족되어 빙고가 되면 프로그램 끝내기, do-while문 끝내기
			
			if (!flag) {
				break;
			}
			

		} while (num != 0);
		
		// 다 끝나고 0으로 빙고가 된 화면을 한번 더 출력하기 위해 다시 코드를 한 번 더 넣어줌.
		for (int[] a : bingo) {
			for (int n : a) {
				System.out.print(n + " ");
			}
			System.out.println();
		}


		// 가로로 한 줄이 맞으면 "빙고! "라고 출력하고 종료해라 (추가적인 미션이었지만 미완..)
		System.out.println();
		System.out.println(" ===================== ");
		System.out.println(" ===== B I N G O ===== ");
		System.out.println(" ===================== ");

		}

	}

'2024_UIUX 국비 TIL' 카테고리의 다른 글

UIUX _국비과정 0408  (0) 2024.05.29
UIUX _국비과정 0405  (0) 2024.05.29
UIUX _국비과정 0403  (0) 2024.05.29
UIUX _국비과정 0402  (0) 2024.05.29
UIUX _국비과정 0401  (0) 2024.05.28

+ Recent posts