<이공계전문기술연수> 15. Java 배열(2) (복사/버블정렬/로또/다차원)

2019. 8. 15. 16:12· 이공계전문기술연수/Java

배열의 복사(copy)

1. 얕은 복사


int [ ] num1 = {10,20,30,40,50};
int [ ] num2;
num2 = num1;
num1 [0] = 100;

system.out.print(num1 [0]); -> 100
system.out.print(num2 [0]); -> 100      -> 10 아님

int [ ] num1 = {10,20,30,40,50}; 
int [ ] num2; 
num2 = num1; 
num1[0] = 100;

system.out.print(num1[0]); -> 100 
system.out.print(num2[0]); -> 100 

 

객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 변수가 참조하고 있는 것!

 

 

 

 

2. 깊은 복사


다른 객체를 생성하여 새로운 객체에 데이터 내용을 복사하는 것!
 
3가지 방법


1) for문을 이용한 1:1 복사
2) System.arraycopy() 메서드를 이용한 복사
3) clone() 이용한 복사

 

 

1) for문을 이용한 1:1 복사

	// 1. for문을 이용한 1:1 복사

		int[] num1 = { 10, 20, 30, 40, 50 };
		int[] num2;
		num2 = num1;
		num1[0] = 100;
		int[] num3 = new int[num1.length];
		for (int i = 0; i < num3.length; i++) {
			num3[i] = num1[i];
		}

 

2) System.arraycopy() 메서드를 이용한 복사 

 

// 2. System.arraycopy()
	
    	int[] num5 = new int[num1.length];
		// num1 = > {10,20,30,40,50}
		System.arraycopy(num1, 0, num5, 0, num1.length);
		// 전체복사

 

3) clone() 이용한 복사

 

int[] num1 = { 10, 20, 30, 40, 50 };
int[] num4;
num4 = num1.clone();

 

 

 

 

<실습>

 

1. 사용자의 전화번호를 입력받고, 13자리의 문자형 배열에 저장한 후, 가운데 4자리를 * 로 가리기!

   (단, 원본 배열 값은 변경 없이 배열 복사본으로 변경하세요.)

	public void test8() {

		// 사용자의 전화번호를 입력받고, 13자리의 문자형배열에 저장한후, 가운데 4자리를 *로 가리기
		// 단, 원본배열값은 변경없이 배열 복사본으로 변경하세요

		Scanner sc = new Scanner(System.in);
		System.out.println("전화번호 입력 : ");
		String phoneNumber = sc.next();
		// 010-1111-1111
		char[] arr = new char[13];
		for (int i = 0; i < arr.length; i++) {
			if (i >= 4 && i <= 7) {
				arr[i] = '*';
			} else {
				arr[i] = phoneNumber.charAt(i);
			}
			System.out.print(arr[i]);
		}

	}

String으로 받은 이유는 - 때문이다.

코드를 출력하면 결과가 나온다.

 

전화번호 입력 : 
010-1234-5678
010-****-5678

 

 

 

2. 주민등록번호 성별 자리 이후부터 *로 가리기!

(단, 원본 배열 값은 변경 없이 배열 복사본으로 변경하세요.)

public void test9() {

		// 주민등록번호 성별자리 이후부터 *로 가리기.
		// 단,원본 배열값은 변경없이 배열 복사본으로 변경하세요

		Scanner sc = new Scanner(System.in);
		System.out.println("주민등록번호 입력 :");
		String num = sc.next();
		// 900000-0000000
		char[] arr = new char[14];
		for (int i = 0; i < arr.length; i++) {
			if (i > 7) {
				arr[i] = '*';
			} else {
				arr[i] = num.charAt(i);
			}
			System.out.print(arr[i]);
		}

	}

코드를 출력하면 결과가 나온다.

 

주민등록번호 입력 :

901212-1234567
901212-1******

 

 

 

3. 배열의 크기로 홀수인 양의 정수를 입력받아 배열은 만드세요.

배열의 중간까지는 1부터 1씩 증가하여 오름차순으로 값을 넣고, 중간 이후부터는 끝까지 1씩 감소하여 내림차순으로
값을 넣어 출력하는 프로그램을 작성하세요.

 

public void test10() {
		// 배열의 크기로 홀수인 양의 정수를 입력받아 배열을 만드세요.
		// 배열의 중간까지는 1부터 1씩 증가하여 오름차순으로 값을 넣고
		// 중간 이후부터 끝까지는 1씩 감소하여 내림차순으로 값을 넣어 출력하는 프로그램을 작성하시오

		// int count = 0;
		// Scanner sc = new Scanner(System.in);
		// System.out.println("양의 정수 홀수 입력 :");
		// int num = sc.nextInt();
		// int[] arr = new int[num];
		//
		// for(int i=0; i<num/2+1;i++) {
		// arr[i] = ++count;
		// }
		// for(int i=num/2+1;i<arr.length; i++) {
		// arr[i] = --count;
		// System.out.print();

		Scanner sc = new Scanner(System.in);
		System.out.println("양의 정수 홀수 입력 :");
		int num = sc.nextInt();
		int[] arr = new int[num];
		for (int i = 0; i < arr.length; i++) {
			if (i > arr.length / 2) {
				arr[i] = arr.length - i;
			} else {
				arr[i] = i + 1;
			}
			System.out.print(arr[i]);
		}

	}

 

코드를 출력하면 결과가 나온다.

 

양의 정수 홀수 입력 :
9
123454321

 

4. 문자열에서 문자 찾기!

 

	public void test11() {

		Scanner sc = new Scanner(System.in);
		System.out.println("문자열 입력 : ");
		String str = sc.next();
		System.out.println("검색 값 입력 : ");
		char ch = sc.next().charAt(0);
		int count = 0;
		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) == ch) {
				count++;

			}
		}
		System.out.println("찾는 문자는 총 : " + count + "개");

	}

코드를 출력하면 결과가 나온다.

 

문자열 입력 : 
koreagood
검색 값 입력 : 
o
찾는 문자는 총 : 3개

 

 

 

 

 

5. 버블 정렬

 

public void test12() {

		// 정렬
		// 규칙에 맞춰서 순서를 재배열
		// 오름차순, 내림차순

		// 5 , 3 , 2 , 4 , 1
		// -> 오름차순정렬
		// -> 최종결과 -> 1 , 2 , 3 , 4 , 5

		// 버블 정렬
		// 5 4 3 2 1
		// 4 3 2 1 5
		// 3 2 1 4 5
		// 2 1 3 4 5
		// 1 2 3 4 5

		// int [] arr = new int[2] ;
		// arr [0] = 5;
		// arr [1] = 3;
		// if(arr[0] > arr[1]) {
		// int tmp = arr[1];
		// arr[1] = arr[0];
		// arr[0] = tmp;
		
		int[] arr1 = { 5, 4, 3, 2, 1 };
		// 버블정렬 로직을 통해서 아래 출력 결과가 1 2 3 4 5 이 되도록
		for (int i = 0; i < arr1.length; i++) { // 총 배열 길이보다 1개 작게
			for (int j = 0; j < arr1.length - 1 - i; j++) { // 매 반복마다 1씩 줄어들수 있게
				if (arr1[j] > arr1[j + 1]) {
					int tmp = arr1[j];
					arr1[j] = arr1[j + 1];
					arr1[j + 1] = tmp;
				}
			}
			for (int j = 0; j < arr1.length; j++) {
				System.out.print(arr1[j] + "");

			}
			System.out.println();

		}
	}

코드를 출력하면 결과가 나온다.

 

43215
32145
21345
12345
12345

 

 

6. 로또 프로그램

 

 

public void test13() {

		int[] input = new int[6];
		int count = 0;

		Scanner sc = new Scanner(System.in);
		System.out.println("==== 로또 프로그램 ====");
		Random r = new Random();

		for (int i = 0; i < 6; i++) { // num.length; 까지 해도됨
			System.out.println(i + 1 + "번째 번호 입력 :");
			int num = sc.nextInt(); // num[i] = sc.nextint();

			input[i] = num;
			for (int j = 0; j < i; j++) {
				if (num == input[j]) {
					System.out.println("숫자가 중복되었습니다."); // 여기까지는 그냥 중복 이라고 출력
					i--; // **** 초기화 *****
					// 중복 for문이 끝나면 전체 for문의 증감으로 간다

					break; // ???????????????????????
				}
			}
		}

		int[] output = new int[6];
		for (int i = 0; i < 6; i++) {
			int cNum = r.nextInt(45) + 1;
			output[i] = cNum;
			for (int j = 0; j < i; j++) {
				if (cNum == output[j]) {
					i--;
				}
			}
		}

		for (int i = 0; i < 6; i++) {
			for (int j = 0; j < 6; j++) {
				if (input[i] == output[j])
					count++;
			}
		}

		for (int i = 0; i < input.length; i++) { // 총 배열 길이보다 1개 작게
			for (int j = 0; j < input.length - 1 - i; j++) { // 매 반복마다 1씩 줄어들수 있게
				if (input[j] > input[j + 1]) {
					int tmp = input[j];
					input[j] = input[j + 1];
					input[j + 1] = tmp;
				}
				if (output[j] > output[j + 1]) {
					int tmp = output[j];
					output[j] = output[j + 1];
					output[j + 1] = tmp;
				}
			}
		}

		// for (int i = 0; i < input.length; i++) { // 총 배열 길이보다 1개 작게
		// for (int j = 0; j < input.length - 1 - i; j++) { // 매 반복마다 1씩 줄어들수 있게
		// if (input[j] > input[j + 1]) {
		// int tmp = input[j];
		// input[j] = input[j + 1];
		// input[j + 1] = tmp;
		// }
		// }
		// }

		for (int i = 0; i < 6; i++) {
			System.out.print(input[i] + " ");
		}
		System.out.println();

		for (int i = 0; i < 6; i++) {
			System.out.print(output[i] + " ");
		}

		System.out.println("맞은 갯수는 " + count);

		switch (count) {
		case 6:
			System.out.println("1등");
			break;
		case 5:
			System.out.println("2등");
			break;
		case 4:
			System.out.println("3등");
			break;
		case 3:
			System.out.println("4등");
			break;
		case 2:
		case 1:
		case 0:
			System.out.println("꽝");
			break;

		}
	}

 

코드를 출력하면 결과가 나온다.

 

==== 로또 프로그램 ====
1번째 번호 입력 :
17
2번째 번호 입력 :
37
3번째 번호 입력 :
12
4번째 번호 입력 :
27
5번째 번호 입력 :
9
6번째 번호 입력 :
44
9 12 17 27 37 44 
3 10 12 29 37 40 맞은 개수는 2
꽝

 

 

 

 

 

다차원 배열

 

행과 열로서 구성된 배열을 2차원 배열이라고 한다.

2차원 배열은 수학의 행렬을 떠올리면 되는데 가로 인덱스와 세로 인덱스를 사용한다.

자바는 2차원 배열을 중첩 배열 방식으로 구현한다. 

 

타입[ ][ ] 변수 = {{값1,값2, ...} , {값1, 값2, ...}, ... };

 

<실습>

 

	public void test16() {

		int[][] arr = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
		int[][] arr1 = new int[3][4];

		int count = 1;
		for (int i = 0; i < arr1.length; i++) { // 행의길이
			for (int j = 0; j < arr1[i].length; j++) { // 열의길이
				arr1[i][j] = count;
				count++;
				System.out.print(arr1[i][j] + "\t");
			}
			System.out.println(); // 
		}

	}

 

코드를 출력하면 결과가 나온다.

 

1  2   3   4
5  6   7   8
9 10 11 12

 

 

	public void test17() {

		int count = 1;
		int[][] arr1 = new int[5][5];
		for (int i = 0; i < arr1.length; i++) {
			for (int j = 4; j >= 0; j--) {
				arr1[i][j] = count;
				count++;
			}
		}
		for (int i = 0; i < arr1.length; i++) {
			for (int j = 0; j < arr1[i].length; j++) {
				System.out.print(arr1[i][j] + "\t");
			}
			System.out.println();
		}
	}

코드를 출력하면 결과가 나온다.

 

5   4   3   2   1
10   9   8  7  6
15 14 13 12 11
20 19 18 17 16
25 24 23 22 21

 

 

public void test18() {

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

	public void test19() {

		int count = 1;
		int[][] arr1 = new int[5][5];
		for (int i = 0; i < 5; i++) {
			for (int j = 4; j >= 0; j--) {
				arr1[j][i] = count;
				count++;
			}
		}
		for (int i = 0; i < arr1.length; i++) {
			for (int j = 0; j < arr1[i].length; j++) {
				System.out.print(arr1[i][j] + "\t");
			}
			System.out.println();
		}

	}

test18 코드를 출력하면 결과가 나온다.

 

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

 

 

test19 코드를 출력하면 결과가 나온다.

 

5 10 15 20 25
4 9 14 19 24
3 8 13 18 23
2 7 12 17 22
1 6 11 16 21

'이공계전문기술연수 > Java' 카테고리의 다른 글

<이공계전문기술연수>18. Java 상속  (0) 2019.08.21
<이공계전문기술연수> 16. Java 객체지향프로그래밍(OOP) 클래스  (0) 2019.08.16
<이공계전문기술연수> 14. Java 배열(1)  (0) 2019.08.15
<이공계전문기술연수> 13. 참조 타입 / 참조 변수  (0) 2019.08.15
<이공계전문기술연수> 12. Java 반복문: while문 / break문  (0) 2019.08.13
'이공계전문기술연수/Java' 카테고리의 다른 글
  • <이공계전문기술연수>18. Java 상속
  • <이공계전문기술연수> 16. Java 객체지향프로그래밍(OOP) 클래스
  • <이공계전문기술연수> 14. Java 배열(1)
  • <이공계전문기술연수> 13. 참조 타입 / 참조 변수
임쟌
임쟌
임쟌
Jian's Blog
임쟌
전체
오늘
어제

공지사항

  • [자기소개]
  • 쟌's Blog (227)
    • Language (32)
      • Python (8)
      • Go (24)
      • Java (0)
    • Framework (10)
      • Django (9)
      • Gin (1)
      • Spring boot (0)
      • Fiber (0)
    • Database (10)
      • PostgreSQL (8)
      • MySQL (0)
      • Redis (2)
    • Server (51)
      • Linux (16)
      • Git (12)
      • Oracle Cloud Infrastructure (13)
      • Mac (4)
      • Docker (4)
      • RabbitMQ (0)
      • ETC (2)
    • Operating System (0)
      • OS (0)
    • Algorithm (22)
      • Go (22)
      • Python (0)
    • Exam Certification (4)
    • Daily Life (27)
      • Review (21)
      • Diary (6)
    • 이공계전문기술연수 (71)
      • Java (17)
      • Database (8)
      • HTML | CSS (13)
      • JavaScript | jQuery (6)
      • Servlet | JSP (16)
      • Spring Framework (11)

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
임쟌
<이공계전문기술연수> 15. Java 배열(2) (복사/버블정렬/로또/다차원)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.