작성 : 2024. 4. 6. 13:49
자동 import : Command + Shift + o
배열을 이용한 프로그램 알아보기
배열의 복사 :
ex) arr1 → arr2 옮기기
- 반복문
- 메소드
// 반복문을 이용
배열의 한 자리 복사하는 코드:
// (배열의 선언 = 초기화 방법들)
// 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 |