1차원 배열 실습 문제

Hyunsu·2023년 3월 5일
0

국비 교육

목록 보기
10/36
post-thumbnail

실습 문제 1

🚩 메서드명 : public void practice1 ( )

길이가 9인 배열을 선언 및 할당하고, 1부터 9까지의 값을 반복문을 이용하여
순서대로 배열의 각 인덱스 요소에 대입하고 출력한 후
짝수 번째 인덱스 값의 합을 출력하세요. (0 번째 인덱스는 짝수로 취급)

실행 화면

1 2 3 4 5 6 7 8 9
짝수 번째 인덱스 합 : 25

소스 코드

public void practice1() {
	int[] arr = new int[9];

	int sum = 0;
	for (int i = 0; i < arr.length; i++) {
		arr[i] = i + 1;
		System.out.print(arr[i] + " ");

		if (i % 2 == 0) {
			sum += arr[i];
		}
	}

	System.out.println("\n짝수 번째 인덱스 합 : " + sum);
    
}

실습 문제 2

🚩 메서드명 : public void practice2 ( )

길이가 9인 배열을 선언 및 할당하고, 9부터 1까지의 값을 반복문을 이용하여
순서대로 배열의 각 인덱스 요소에 대입하고 출력한 후
홀수 번째 인덱스 값의 합을 출력하세요. (0 번째 인덱스는 짝수로 취급)

실행 화면

9 8 7 6 5 4 3 2 1
홀수 번째 인덱스 합 : 20

소스 코드

public void practice2() {
	int[] arr = new int[9];

	int sum = 0;
	for (int i = 0; i < arr.length; i++) {
		arr[i] = arr.length - i;
		System.out.print(arr[i] + " ");

		if (i % 2 == 1) {
			sum += arr[i];
		}
	}

	System.out.println("\n홀수 번째 인덱스 합 : " + sum);
    
}

실습 문제 3

🚩 메서드명 : public void practice3 ( )

사용자에게 입력 받은 양의 정수만큼 배열 크기를 할당하고
1부터 입력 받은 값까지 배열에 초기화한 후 출력하세요.

실행 화면

양의 정수 : 5
1 2 3 4 5

소스 코드

public void practice3() {
    Scanner sc = new Scanner(System.in);

    System.out.print("양의 정수 : ");
    int[] arr = new int[sc.nextInt()];

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

실습 문제 4

🚩 메서드명 : public void practice4 ( )

정수 5개를 입력 받아 배열을 초기화 하고
검색할 정수를 하나 입력 받아 배열에서 같은 수가 있는 인덱스를 찾아 출력하세요.
배열에 같은 수가 없을 경우 "일치하는 값이 존재하지 않습니다" 출력하세요.

실행 화면 1

입력 0 : 5
입력 1 : 8
입력 2 : 9
입력 3 : 10
입력 4 : 4
검색할 값 : 8
인덱스 : 1

실행 화면 2

입력 0 : 5
입력 1 : 8
입력 2 : 9
입력 3 : 10
입력 4 : 4
검색할 값 : 1
일치하는 값이 존재하지 않습니다.

소스 코드

public void practice4() {
	Scanner sc = new Scanner(System.in);

	int[] arr = new int[5];

	for (int i = 0; i < arr.length; i++) {
		System.out.printf("입력 %d : ", i);
		arr[i] = sc.nextInt();
	}

	System.out.print("검색할 값 : ");
	int search = sc.nextInt();

	boolean flag = true;

	for (int i = 0; i < arr.length; i++) {
		if (arr[i] == search) {
			System.out.println("인덱스 : " + i);
			flag = false;
			break;
		}
	}

	if (flag)
		System.out.println("일치하는 값이 존재하지 않습니다.");
        
}

실습 문제 5

🚩 메서드명 : public void practice5 ( )

문자열을 입력 받아 문자 하나 하나를 char 배열에 대입하고
검색할 문자가 문자열에 몇 개 들어가 있는지, 몇 번째 인덱스에 위치하는지 인덱스를 출력하세요.

실행 화면

문자열 : application
문자 : i
application 에 i 가 존재하는 위치 (인덱스) : 4 8
i 개수 : 2

소스 코드

public void practice5() {

	// 1. 사용자에게 문자열과 문자 입력받기
	Scanner sc = new Scanner(System.in);

	System.out.print("문자열 : ");
	String str = sc.nextLine();

	// 2. 사용자가 입력한 문자열(str)의 문자 하나하나를 char 배열에 넣기

	// 먼저 사용자가 입력한 문자열 길이만큼의 char 배열을 할당
	char[] arr = new char[str.length()];

	// 반복문을 통해 str.charAt(i) 값을 arr[i] 에 담는 과정
	for (int i = 0; i < arr.length; i++) {
		arr[i] = str.charAt(i);
	}

	System.out.print("문자 : ");
	char ch = sc.nextLine().charAt(0);

	// 3. 검색할 문자가 문자열에 몇 개가 들어있는지와 어느 인덱스에 있는지 파악
    
	// 검색할 문자가 문자열에 몇 개가 들어있는지를 세어줄 변수
    // 문자열에서 동일한 문자가 발생할 때마다 1씩 증가
	int count = 0; 

	// 반복문 수행전 문자열 출력
	System.out.print(str + "에 " + ch + "가 존재하는 위치(인덱스) : ");

	// 인덱스마다 접근하기 위해 반복문 사용
	for (int i = 0; i < arr.length; i++) {
		if (arr[i] == ch) { // 해당 인덱스 값이 검색될 문자와 같을 경우
			System.out.print(i + " "); // 해당 인덱스 이어서 출력

			count++; // 그리고 count 1 증가
		}
	}

	System.out.println(); // 개행
	System.out.println(ch + "개수 : " + count);

}

실습 문제 6

🚩 메서드명 : public void practice6 ( )

사용자가 배열의 길이를 직접 입력하여 그 값만큼 정수형 배열을 선언 및 할당하고
배열의 크기만큼 사용자가 직접 값을 입력하여 각각의 인덱스에 값을 초기화 하세요.
그리고 배열 전체 값을 나열하고 각 인덱스에 저장된 값들의 합을 출력하세요.

실행 화면

정수 : 5
배열 0번째 인덱스에 넣을 값 : 4
배열 1번째 인덱스에 넣을 값 : -4
배열 2번째 인덱스에 넣을 값 : 3
배열 3번째 인덱스에 넣을 값 : -3
배열 4번째 인덱스에 넣을 값 : 2
4  -4  3  -3  2
총 합 : 2

소스 코드

public void practice6() {

	// 1. 사용자에게 값을 입력받고 그 값만큼의 배열 선언 및 할당
	Scanner sc = new Scanner(System.in);

	System.out.print("정수 : ");
	int num = sc.nextInt();

	int[] arr = new int[num];

	// 2. 그 배열의 크기만큼 사용자가 직접 값을 입력하여 각각의 인덱스에 값을 초기화
	for (int i = 0; i < arr.length; i++) {
		System.out.print("배열 " + i + "번째 인덱스에 넣을 값 : ");
		arr[i] = sc.nextInt();
	}

	// 3. 전체 값 나열 및 총 합 출력
	int sum = 0;
	for (int i = 0; i < arr.length; i++) {
		System.out.print(arr[i] + " ");
		sum += arr[i];
	}

	System.out.println();
	System.out.println("총 합 : " + sum);
    
}

실습 문제 7

🚩 메서드명 : public void practice7 ( )

주민등록번호를 입력 받아 char 배열에 저장한 후 출력하세요.
단, char 배열 저장 시 성별을 나타내는 숫자 이후부터 * 로 저장하세요.

실행 화면

주민등록번호 (- 포함) : 123456-1234567
123456-1******

소스 코드

public void practice7() {
	Scanner sc = new Scanner(System.in);

	System.out.print("주민등록번호(-포함) : ");
	String input = sc.next();

	char[] arr = new char[input.length()];

	for (int i = 0; i < arr.length; i++) {

		if (i <= 7) { // 인덱스 7 이하
			arr[i] = input.charAt(i);
		} else { // 인덱스 8 이상
			arr[i] = '*';
		}
		System.out.print(arr[i]);
	}
    
}

실습 문제 8

🚩 메서드명 : public void practice8 ( )

3 이상인 홀수를 입력 받아 배열의 중간까지는 1부터 1씩 증가하여 오름차순으로 값을 넣고
중간 이후부터 끝까지는 1씩 감소하여 내림차순으로 값을 넣어 출력하세요.
단, 입력한 정수가 홀수가 아니거나 3 미만일 경우 "다시 입력하세요" 를 출력하고
다시 정수를 받도록 하세요.

실행 화면

정수 : 4
다시 입력하세요
정수 : -6
다시 입력하세요
정수 : 5
1, 2, 3, 2, 1

소스 코드

public void practice8() {

	Scanner sc = new Scanner(System.in);

	while (true) { // 3 이상의 수가 입력 될 때 까지 무한 반복
    
		System.out.print("정수 : ");
		int input = sc.nextInt();

		if (input < 3 || input % 2 == 0) { // 3 미만 또는 짝수인 경우 반복
			System.out.println("다시 입력하세요");

		} else {
        
			int[] arr = new int[input]; // 입력 받은 크기의 배열 생성
			int num = 0; // arr 배열에 대입될 값

			for (int i = 0; i < arr.length; i++) {
				if (i <= arr.length / 2) { // 중간 이전 까지 증가
					arr[i] = ++num;

				} else { // 중간 이후 감소
					arr[i] = --num;
				}

				// 출력 시 , 추가
				if (i == arr.length - 1) { // 마지막 바퀴는 제외
					System.out.print(arr[i]);

				} else {
					System.out.print(arr[i] + ", ");
				}

			}
			break; // while 반복 멈춤
		}
	}
    
}

실습 문제 9

🚩 메서드명 : public void practice9 ( )

10개의 값을 저장할 수 있는 정수형 배열을 선언 및 할당하고
1부터 10 사이의 난수를 발생시켜 배열에 초기화한 후 출력하세요.

실행 화면

발생한 난수 : 9 7 6 2 5 10 7 2 9 6

소스 코드

public void practice9() {
	int[] arr = new int[10];

	for (int i = 0; i < arr.length; i++) {
		arr[i] = (int)(Math.random() * 10 + 1);
	}

	System.out.print("발생한 난수 : ");
	for (int i = 0; i < arr.length; i++) {
		System.out.print(arr[i] + " ");
	}
    
}

실습 문제 10

🚩 메서드명 : public void practice10 ( )

10개의 값을 저장할 수 있는 정수형 배열을 선언 및 할당하고
1부터 10 사이의 난수를 발생시켜 배열에 초기화 후
배열 전체 값과 그 값 중에서 최대값과 최소값을 출력하세요.

실행 화면

발생한 난수 : 5 3 2 7 4 8 6 10 9 10
최대값 : 10
최소값 : 2

소스 코드

public void practice10() {

	int[] arr = new int[10];

	for (int i = 0; i < arr.length; i++) {
		arr[i] = (int)(Math.random() * 10 + 1);

		System.out.print(arr[i] + " ");
	}

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

	int max = 1; // 최소값을 담아줄 변수
	int min = 10; // 최대값을 담아줄 변수

	for (int i = 0; i < arr.length; i++) {

		if (arr[i] > max) { // 해당 인덱스의 값이 max 보다 큰 경우
			max = arr[i]; // 해당 값을 max 변수에 담아줌
		}

		if (arr[i] < min) { // 해당 인덱스의 값이 min 보다 작은 경우
			min = arr[i]; // 해당 값을 min 변수에 담아줌
		}
	}

	System.out.println("최대값 : " + max);
	System.out.println("최소값 : " + min);
    
}

실습 문제 11

🚩 메서드명 : public void practice11 ( )

10개의 값을 저장할 수 있는 정수형 배열을 선언 및 할당하고
1부터 10 사이의 난수를 발생시켜 중복된 값이 없게 배열에 초기화한 후 출력하세요.

실행 화면

4 1 3 6 9 5 8 10 7 2

소스 코드

public void practice11() {

	// 1. 10개의 값을 저장할 수 있는 정수형 배열 선언 및 할당
	int[] arr = new int[10];

	// 2. 각 인덱스 값에 1부터 10 사이의 난수를 중복값 없이 생성
	for (int i = 0; i < arr.length; i++) {

		arr[i] = (int)(Math.random() * 10 + 1);

		for (int j = 0; j < i; j++) { // 중복 제거
			if (arr[i] == arr[j]) {
				i--;
				break;
			}
		}
	}

	// 3. 출력
	for (int i = 0; i < arr.length; i++) {
		System.out.print(arr[i] + " ");
	}
    
}

실습 문제 12

🚩 메서드명 : public void practice12 ( )

로또 번호 자동 생성기 프로그램을 만드세요. (중복 없이 오름차순 정렬해 출력)

실행 화면

3 4 15 17 28 40

소스 코드

public void practice12() {

	// 1. 크기가 6인 정수형 배열 선언 및 할당
	int[] lotto = new int[6];

	// 2. 배열에 중복값없이 1부터 45 사이의 난수 초기화
	for (int i = 0; i < lotto.length; i++) {
		lotto[i] = (int)(Math.random() * 45 + 1);

		for (int j = 0; j < i; j++) { // 중복 제거
			if (lotto[i] == lotto[j]) {
				i--;
				break;
			}
		}
	}

	// 3. 오름차순 정렬 (선택 정렬)
	for (int i = 0; i < lotto.length - 1; i++) { // 비교 주체
		for (int j = i + 1; j < lotto.length; j++) { // 비교 대상
			if (lotto[i] > lotto[j]) { // 비교 주체가 비교 대상보다 큰 경우 값을 바꿔줘야됨
				int temp = lotto[i];
				lotto[i] = lotto[j];
				lotto[j] = temp;
			}
		}
	}

	// 4. 출력
	for (int i = 0; i < lotto.length; i++) {
		System.out.print(lotto[i] + " ");
	}
    
}

실습 문제 13

🚩 메서드명 : public void practice13 ( )

문자열을 입력 받아 문자열에 어떤 문자가 들어갔는지 배열에 저장하고
문자의 개수와 함께 출력하세요. (중복 제거)

실행 화면

문자열 : application
문자열에 있는 문자 : a, p, l, i, c, t, o, n
문자 개수 : 8

소스 코드

public void practice13() {

	// 1. 사용자에게 문자열 입력받기
	Scanner sc = new Scanner(System.in);

	System.out.print("문자열 : ");
	String str = sc.nextLine();

	// 2. 해당 문자열의 문자들을 char[] 안에 담기
	char[] arr = new char[str.length()];

	for (int i = 0; i < arr.length; i++) {
		arr[i] = str.charAt(i);
	}

	// 3. char 배열에서 중복값 존재할 경우 출력 안함
	int count = 0; // 문자 개수 카운트

	System.out.print("문자열에 있는 문자 : ");

	for (int i = 0; i < arr.length; i++) {
		boolean flag = true; // 중복 체크용 flag

		for (int j = 0; j < i; j++) {
			if (arr[i] == arr[j]) {
				flag = false; // 중복이 발생했을 경우
				break;
			}
		}

		if (flag) { // 중복이 발생하지 않았을 경우
			if (i == 0) {
				System.out.print(arr[i]);
			} else {
				System.out.print(", " + arr[i]);
			}

			count++;
		}
	}

	System.out.println();
	System.out.println("문자 개수 : " + count);
    
}

실습 문제 14

🚩 메서드명 : public void practice14 ( )

사용자가 입력한 배열의 길이만큼의 String 배열을 선언 및 할당하고
배열의 인덱스에 넣을 값 역시 사용자가 입력하여 초기화 하세요.
단, 사용자에게 배열에 값을 더 넣을지 물어보고 몇 개를 더 입력할 건지
늘린 곳에 어떤 데이터를 넣을 것인지 받으세요.
사용자가 더 이상 입력하지 않겠다고 하면 배열 전체 값을 출력하세요.
(배열의 얕은 복사와 깊은 복사를 이용하는 문제)

얕은 복사 : 배열의 시작 주소만을 복사하여 두 참조 변수가 하나의 배열을 참조
깊은 복사 : 원본 배열이 가지고 있는 데이터를 그대로 복사한 새로운 배열

tip 깊은 복사를 위한 새로운 배열은 꼭 원본 배열과 같은 크기일 필요는 없음

실행 화면

배열의 크기를 입력하세요 : 3
1번째 문자열 : 자바의 정석
2번째 문자열 : 알고리즘
3번째 문자열 : C 프로그래밍
더 값을 입력하시겠습니까? (Y/N) : y
더 입력하고 싶은 개수 : 2
4번째 문자열 : 인간관계
5번째 문자열 : 자기계발
더 값을 입력하시겠습니까? (Y/N) : y
더 입력하고 싶은 개수 : 1
6번째 문자열 : 영단어 600
더 값을 입력하시겠습니까? (Y/N) : n
[ 자바의 정석, 알고리즘, C 프로그래밍, 인간관계, 자기계발, 영단어 600 ]

소스 코드

public void practice14() {

	Scanner sc = new Scanner(System.in);

	// 1. 첫 배열 크기 지정
	System.out.print("배열의 크기를 입력 하시오 : ");
	int size = sc.nextInt(); // 입력 버퍼에 개행문자가 남음

	sc.nextLine(); // 입력 버퍼에 남은 개행문자 제거

	// 2. 첫 배열 생성
	String[] books = new String[size];

	// 3. 첫 배열에 저장할 문자열 입력 받기
	for (int i = 0; i < books.length; i++) {
		System.out.print((i + 1) + "번째 문자열 : ");
		books[i] = sc.nextLine(); // 입력 버퍼에서 다음 엔터까지 읽어옴
	}

	// 4. n 입력될 때 까지 무한 반복
	while (true) {

		System.out.print("더 값을 입력하시겠습니까? (Y/N) :  ");
		char ch = sc.nextLine().charAt(0);

		if (ch == 'N') {
			break;
		}

		// 5. 더 입력 받을 개수 입력
		System.out.print("더 입력하고 싶은 개수 : ");
		int addSize = sc.nextInt();
		sc.nextLine(); // 입력 버퍼 개행문자 제거

		// 6. 기존 배열보다 늘어난 개수만큼 큰 새 배열 생성
		String newBooks[] = new String[books.length + addSize];

		// 7. 깊은 복사를 통해 기존 배열 내용을 새 배열로 복사
		System.arraycopy(books, 0, newBooks, 0, books.length);

		// 8. 새 배열의 빈칸부터 새로운 입력을 받아서 저장
		for (int i = books.length; i < newBooks.length; i++) {
			System.out.print((i + 1) + "번째 문자열 : ");
			newBooks[i] = sc.nextLine();
		}

		// 9. 기존 참조배열 books에 newBooks의 주소를 얕은 복사
		books = newBooks;

	} // while 종료

	// 10. 배열에 저장된 모든 값 출력
	System.out.println(Arrays.toString(books));

}


Scanner 사용법

실습 문제 14 보충 설명

public void scannerEx() {

	Scanner sc = new Scanner(System.in);

	// 1) next() : 한 단어 (엔터를 만나면 입력 종료)
	// 2) nextLine() : 한 문장 (엔터를 만나면 입력 종료)

	System.out.print("입력 : "); // hello world
    
	String str = sc.next(); // hello 
	String str = sc.nextLine(); // hello world

	System.out.println(str); 

	// 3) 스캐너 입력 버퍼와 nextXXX() 후처리
	// 입력을 하면 입력 버퍼에 저장한 뒤 nextXXX() 통해 버퍼 내용을 읽어옴
    
	// nextLine() : hello world(엔터) - hello world(엔터) - 엔터 제거
    
    // nextInt() : 100(엔터) - 100 - 엔터 남음
	// nextInt(), nextDouble(), next() 등 모두 입력 버퍼에서 엔터 제외하고 내용만 읽어옴

	System.out.print("nextInt() : "); // 입력버퍼 [ 100(엔터) ]
	int a = sc.nextInt(); // 입력버퍼 [ (엔터) ]

	// 문제 해결
	sc.nextLine(); // 입력버퍼 [ ]

	System.out.println("nextLine() : "); // 입력버퍼 [ a b c(엔터) ]
	String s = sc.nextLine(); // 입력버퍼 [ ]

	System.out.println("종료");

	// ** 문제점 **
	// nextInt() 이후 입력 버퍼에 남아있는 (엔터) 때문에
    // 다음 nextLine() 수행 시 버퍼에 남아있는 (엔터) 읽어버리기 때문에
	// 추가적인 입력을 시도하지 못하고 다음 코드로 넘어가는 문제 발생

	// ** 해결 방법 **
	// 입력을 위한 nextLine() 수행 전 입력 버퍼에서 (엔터) 제거
	// 빈 공간에 sc.nextLine() 구문을 한번 작성하면 (엔터) 제거됨
    
}
profile
현수의 개발 저장소

0개의 댓글