배열 (23.05.05)

·2023년 5월 9일
0

Coding Test

목록 보기
10/39
post-thumbnail

✏️ 문제 1

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

[실행 화면]
정수 : 4
다시 입력하세요.
정수 : -6
다시 입력하세요.
정수 : 5
1, 2, 3, 2, 1

(1) 내 풀이

		Scanner sc = new Scanner(System.in);
		
		System.out.print("정수 : ");
		int input = sc.nextInt();
		
		while (input %2 == 0 || input < 3) {
			System.out.println("다시 입력하세요.");
			System.out.print("정수 : ");
			input = sc.nextInt();
		}
		
		int[] arr = new int[input];
		int x = input / 2;
		for(int i=0; i<=x; i++) {
			arr[i] = i + 1;
			System.out.print(arr[i] + ", ");
			} 

		for(int j=x; j>=1; j--) {
			arr[x+1] = j;
			if(j != 1) {
				System.out.print(arr[x+1] + ", ");
			}else {
				System.out.print(arr[x+1]);
			}
		}
	}	

(2) 다른 풀이

      Scanner sc = new Scanner(System.in);

      while (true) { // 3 이상의 수가 입력 될 때 까지 무한 반복
                  // -> 3 이상이 입력되면 break문으로 종료

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

         if (input < 3 || input % 2 == 0) { // 3 미만 또는 짝수인 경우 -> 반복
            System.out.println("다시 입력하세요.");
            // continue;
         } 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 반복 멈춤
         }
      }

✏️ 문제 2

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

[실행 화면]
발생한 난수 : 9 7 6 2 5 10 7 2 9 6

(1) 풀이

		int[] arr = new int[10];
		
		System.out.print("발생한 난수 : ");

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

✏️ 문제 3

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

[실행 화면]
발생한 난수 : 5 3 2 7 4 8 6 10 9 10 
최대값 : 10
최소값 : 2

(1) 풀이

		int[] arr = new int[10];
		System.out.print("발생한 난수 : ");
		
		for(int i=0; i<arr.length; i++) {
			arr[i] = (int)(Math.random()*10 + 1);
			System.out.print(arr[i] + " ");
		}
		
		int max = arr[0];
		int min = arr[0];
		
		for(int i=0; i<arr.length; i++) {
			if(arr[i] > max) {
				max = arr[i];
			} else if(arr[i] < min){
				min = arr[i];
			}
		}
		
		System.out.println();
		System.out.println("최대값 : " + max);
		System.out.println("최소값 : " + min);

✏️ 문제 4

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

[실행 화면]
4 1 3 6 9 5 8 10 7 2 

(1) 풀이

		int[] arr = new int[10];
		
		for(int i=0; i<arr.length; i++) {
			int random = (int)(Math.random()*10+1);
			arr[i] = random;
			
			for(int j=0; j<i; j++) {
				if(random == arr[j]) {
					i--;
					break;
				}
			}
		}
		
		for(int i=0; i<arr.length; i++) {
				System.out.print(arr[i] + " ");
		}

(2) 자세한 풀이

      int[] arr = new int[10];

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

         // 난수 생성 -> 대입 (단, 중복 제거)
         arr[i] = (int) (Math.random() * 10 + 1); // 1~10 사이 난수

         // 중복 확인 시 i값을 감소 시켜
         // 다음 반복에서 현재 인덱스에 난수 덮어쓰기

         for (int x = 0; x < i; x++) {

            if (arr[i] == arr[x]) {
               // 현재 생생된 난수가 앞서 대입된 난수와 같은 경우 == 중복

               i--; // i를 1 감소 시킴
                     // 바깥쪽 for문 반복 시 다시 i가 1 증가
                     // -> -1 + 1 == 0 (제자리)

               break; // 중복을 찾게되면 더 이상 검사할 필요가 없음
            }
         }
      }

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

✏️ 문제 5

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

[실행 화면]
3 4 15 17 28 40

(1) 풀이

		int[] lotto = new int[6];
		
		for(int i=0; i<lotto.length; i++) {
			int random = (int)(Math.random()*45+1);
			lotto[i] = random;
			
			for(int j=0; j<i; j++) {
				if(random == lotto[j]) {
					i--;
					break;
				}
			}
		}
		
		Arrays.sort(lotto);
		for(int i=0; i<lotto.length; i++) {
			System.out.print(lotto[i] + " ");
		}

(2) 자세한 풀이

      // 1) 정수 6개를 저장할 배열 선언 및 할당
      int[] lotto = new int[6];

      // 2) 생성된 배열을 처음부터 끝까지 순차 접근하는 for문 작성
      for (int i = 0; i < lotto.length; i++) {

         // 3) 1 ~ 45 사이의 난수 생성
         int random = (int) (Math.random() * 45 + 1);
         // 0.0 <= x < 1.0
         // 0.0 <= x * 45 < 45.0
         // 1.0 <= x * 45 + 1 < 46.0
         // 1 <= (int)(x * 45 + 1) < 46

         // 4) 생성된 난수를 순서대로 배열 요소에 대입
         lotto[i] = random;

         // 5) 중복 검사를 위한 for문 작성
         for (int x = 0; x < i; x++) {

            // 6) 현재 생성된 난수와 같은 수가
            // 앞 쪽 요소에 있는지 검사
            if (random == lotto[x]) {

               i--;
               // i가 1씩 증가할 때 마다 난수가 하나 생성된다
               // -> 중복 값이 있으므로 난수를 새로 하나 더 생성해야된다.
               // --> i는 기본적으로 0~5까지 6회 반복 되지만
               // i값을 인위적으로 1 감소시켜 7회 반복 되는 모양을 만듦.

               break;
               // 앞쪽에서 중복 데이터를 발견하면
               // 남은 값을 비교할 필요가 없음
               // -> 효율 향상을 위해서 검사하는 for문을 종료
            }

         }

      } // for문 끝

      // 7) 오름차순 정렬
      // -> 선택, 삽입, 버블, 퀵 등등
      // --> 자바가 정렬 방법을 미리 만들어서 제공하고 있음
      // Arrays.sort(배열명) : 배열 내 값들이 오름차순으로 정렬됨

      Arrays.sort(lotto);

      // 결과 출력
      System.out.println(Arrays.toString(lotto));

✏️ 문제 6

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

[실행 화면]
문자열 : application
문자열에 있는 문자 : a, p, l, i, c, t, o, n
문자 개수 : 8

(1) 내 풀이 - 중복 문자를 제거하는 것을 실패하였다...

		Scanner sc = new Scanner(System.in);
		
		System.out.print("문자열 : ");
		String input = sc.nextLine();
		
		char[] arr = new char[input.length()];
		int ch = 0;
		int sum = 0;
		
		System.out.print("문자열에 있는 문자 : ");
		
		for(int i=0; i<arr.length; i++) {
			arr[i] = input.charAt(i);
			sum++;
			
			if(i == input.length() - 1) {
				System.out.print(arr[i]);
			} else{
				System.out.print(arr[i] + ", ");
			}
		}
		System.out.println();
		System.out.println("문자 개수 : " + sum);

(2) 정답 풀이

		Scanner sc = new Scanner(System.in);
	      
		System.out.print("문자열 : ");
		String input = sc.nextLine();
	      
	    char[] arr = new char[input.length()];
	      
	    int count = 0; // 카운트용 변수
	      
	    System.out.print("문자열에 있는 문자 : ");
	    for(int i=0 ; i<arr.length ; i++) {
	    	arr[i] = input.charAt(i); // 문자열 -> char배열에 옮겨 담기
	         
	    // 중복 검사 + flag
	    // application
	    // 배열 : [a, p, p, l, i, c, a, t, i, o, n]
	    // 화면 :  a, p, l, i, c, t, o, n
	    // 개수 :  1  2  3  4  5  6  7  8
	         
	    	boolean flag = true; // 신호용 변수
	         
	        for(int x=0 ; x<i ; x++) { // 중복 검사용 for문
	            if( arr[i] == arr[x] ) {
	               // 현재 대입된 문자가 앞서 대입된 문자와 같다면 == 중복
	               flag = false; // 신호용 변수의 값을 false로 변경
	               break; 
	            }
	        }
	         
	        if(flag) { // flag가 true인 경우 == 중복이 없었다라는 의미
	            
	        	count++; // 카운트 1 증가
	            
	            if(i == 0) { // 첫 바퀴인 경우
	               System.out.print(arr[i]);
	               
	            } else { // 첫 바퀴가 아닌 경우
	               System.out.print(", " + arr[i]);
	            }
	            
	       }
	         
	    } // 바깥쪽 for문 끝
	      
	    System.out.println("\n문자 개수 : " + count);
		

✏️ 문제 7

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

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

(1) 내 풀이 - 배열의 값을 입력할 때마다 배열의 크기를 늘리는 것에서 막혀 풀지 못했음...

		Scanner sc = new Scanner(System.in);
		
		System.out.print("배열의 크기를 입력하세요 : ");
		int input = sc.nextInt();
		
		String[] arr = new String[input];
		
		for(int i=0; i<arr.length; i++) {
			System.out.print((i+1)+"번째 문자열 : ");
			String input1 = sc.nextLine();
		}
		
		String answer;
		System.out.print("더 값을 입력하시겠습니까?(Y/N) : ");
		answer = sc.next();
		
		do {
			System.out.print("더 입력하고 싶은 개수 : ");
			int input2 = sc.nextInt();
			
			String[] arr2 = new String[input2];
			
			for(int i=arr.length+1; i<=arr2.length; i++) {
				System.out.print(i+"번째 문자열 : ");
				String input3 = sc.nextLine();

				System.out.print("더 값을 입력하시겠습니까?(Y/N) : ");
				answer = sc.next();
			
				if(answer.equals("n") || answer.equals("N")) {
				break;
				}
			}
		} while (answer.equals("y") || answer.equals("Y"));
		
		System.out.println(Arrays.toString(arr));
	}

(2) 정답 풀이 - 얕은 복사와 깊은 복사 이용하기!

		Scanner sc = new Scanner(System.in);
		
		System.out.print("배열의 크기를 입력하세요 : ");
		int size = sc.nextInt();
		sc.nextLine(); // 입력 버퍼 개행 문자 제거
		
		String[] arr = new String[size]; // 배열 선언 및 할당
		
		int start = 0; // while문 내 for문의 초기식에 사용될 변수
		
		while(true) {
			
			for(int i=start; i<arr.length; i++){
				System.out.print( (i+1) + "번째 문자열 : ");
				arr[i] = sc.nextLine();
			}
			
			System.out.print("더 값을 입력하시겠습니까?(Y/N) : ");
			char input = sc.nextLine().charAt(0);
						// 입력받은 문자열 중 제일 앞 문자 하나만 얻어옴
			
			if(input == 'Y' || input == 'y') {
				
				start = arr.length;
				// 추가 입력 받기 위한 추가 배열 부분의 시작 위치
				
				System.out.print("더 입력하고 싶은 개수 : ");
				int addSize = sc.nextInt();
				sc.nextLine(); // 입력 버퍼 개행 문자 제거
				
				// 증가된 크기의 배열을 생성하여 arr 배열 깊은 복사
				String[] copyArr = new String[arr.length + addSize];
				
				for(int i=0; i<arr.length; i++) { // 기존 배열의 크기만큼만 반복
					
					copyArr[i] = arr[i]; // 복사 배열에 기존 배열 값을 같은 인덱스에 대입
				}

				// 배열 얕은 복사
				arr = copyArr; // arr이 참조하는 주소 값을
							   // copyArr의 주소 값을 바꿔서
							   // arr이 참조하는 배열의 크기가 증가한 것처럼 보이게 함
				
			} else { // y/n만 입력했다는 상황을 가정
				
				break; // while 반복 종료
				
			}
		} // while문 끝
		
		System.out.println(Arrays.toString(arr));
profile
풀스택 개발자 기록집 📁

0개의 댓글