본문 바로가기
Dev Story 💻/Java

[Java] 무한의 길이를 갖는 배열 만들기

by 몽테 2021. 11. 28.
반응형

 

 

반복문을 이용하여 입력할수록 길이가 늘어나는 무한의 배열 만들기 (int형과 String형)

 

배열은 한번 길이를 설정하면 길이를 늘릴 수 없다.

하지만 이번 예제에서는 어떻게든 늘리는 방식을 생각해보며 고민해보는 것이 목표이다.

 

1. int형

- 중복값을 허용하지 않는다.(중복값이 있다면 "중복!"을 출력하고 다시 입력받도록 프로그래밍 한다.)

- 길이는 임의의 길이 3부터 시작하여 배열이 꽉차면 3씩 길이를 늘린다.

- 입력 받을 값은 정수형으로 제한한다.

 

예시

 

↓↓답↓↓

더보기
package exam;

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

public class InfinityArrayDuplicationForInt {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		// int형
		int num = 3; // 배열크기용 변수
		int start = 0; // 시작값 없어도됨
		int increase = 3; // 늘어날 배열크기
		int[] arr = new int[num]; // 원본 배열
		int[] copyArr = new int[num]; // 백업용 배열
		
		for (int i = start; i < num; i++) {
			boolean flag = false;	
            //중복검증용 변수, 디폴트 false( 반복문이 한싸이클 끝나면 초기화해줘야함)
			System.out.printf("입력(현재길이:%d) : ", num);
			arr[i] = scan.nextInt();
			
			for(int j = start; j < i; j++) {	
            //입력한 숫자의 이전 인덱스들과 비교하는 반복문
				if(arr[i] == arr[j]) {
					flag = true;				
                    //중복이 있다면 트루
				}
				
			}
			if(flag) {	//중복이있다면 트루이므로 if문 실행
				System.out.println("중복!");
				i--;		
                // 중복이 있다면 다시 입력을받으나 인덱스번호가 진행되면 안되므로 i--
				continue;	
                // 중복이있다면 아래 코드를 실행하지않고 입력 재실행을 위해 continue사용
			}
			if (i == num - 1) { // 배열의 마지막 인덱스에 도착하면

				for (int j = start; j < num; j++) {
					copyArr[j] = arr[j];
                    // 배열크기를 늘리면 값이 초기화 되므로 백업용배열에 백업해둠
				}
				num += increase; // 배열크기를 늘리고
				arr = new int[num]; // 늘어난 크기로 배열 재생성
				for (int j = start; j < num - increase; j++) {
					arr[j] = copyArr[j]; // 초기화된 배열에 다시 백업값을 복사
				}
				copyArr = new int[num]; 
                // 백업용 배열을 원본배열 크기와 일치시켜줘야 예외발생 안함
			}
			//System.out.println(Arrays.toString(arr)); // 테스트용 출력
			for(int j = 0; j < i+1; j++) {		
            // 별찍기 원리를 이용하여 현재 입력된 배열값 출력
				System.out.print(arr[j]+", ");
			}
			System.out.println();				//개행
		}

		scan.close();
	}
}

2. String형

- 중복값을 허용하지 않는다.(중복값이 있다면 "중복!"을 출력하고 다시 입력받도록 프로그래밍 한다.)

- 길이는 임의의 길이 3부터 시작하여 배열이 꽉차면 3씩 길이를 늘린다.

- 입력 받을 값은 문자열으로 제한한다.

예시

 

↓↓답↓↓

더보기
package exam;

import java.util.Scanner;

public class InfinityArrayDuplicationForStr {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		//String형
		
		int num = 3;					//배열크기용 변수
		int increase = 3;				//늘어날 배열크기
		String[] nameArr = new String[num];	//원본 배열
		String[] copyArr = new String[num];	//백업용 배열
		for(int i = 0; i < num; i++) {
			boolean flag = false;
            //중복검증용 변수, 디폴트 폴스( 반복문이 한싸이클 끝나면 초기화해줘야함)
			System.out.printf("입력(현재길이:%d) : ",num);
			nameArr[i] = scan.nextLine();
			
			for(int j = 0; j < i; j++) {
            //입력한 숫자의 이전 인덱스들과 비교하는 반복문
				if(nameArr[i].equals(nameArr[j])) {
					flag = true;		//중복이 있다면 트루
				}
			}
			if(flag) {				//중복이있다면 트루이므로 if문 실행
				System.out.println("중복!");
				i--;				
                // 중복이 있다면 다시 입력을받으나 인덱스번호가 진행되면 안되므로 i--
				continue;			
                // 중복이있다면 아래 코드를 실행하지않고 입력 재실행을 위해 continue사용
			}
			
			if(i == num - 1) {			// 배열의 마지막인덱스에 도착하면
				
				for(int j = 0; j < num; j++) {
					copyArr[j] = nameArr[j];	
                    // 원본배열 초기화를 대비해 백업
				}
				num+=increase;					// 배열 길이 증가
				nameArr = new String[num];		
                // 늘어난 길이로 배열 재생성(값은 초기화됨)
				for(int j = 0; j < num-increase; j++) {
					nameArr[j] = copyArr[j];	
                    // 백업한 값을 원본배열에 다시 복사(for문의 길이는 백업용만큼만)
				}
				copyArr = new String[num];		
                // 백업용 배열길이 원본배열 길이에 맞춰줌
			}
			//System.out.println(Arrays.toString(nameArr));
			for(int j = 0; j < i+1; j++) {		
            // 별찍기 원리를 이용하여 현재 입력된 배열값 출력
				System.out.print(nameArr[j]+", ");
			}
			System.out.println();				//개행
			
		}
		
		scan.close();
	}
}

 

 

끝!
반응형

댓글