반응형
반복문을 이용하여 입력할수록 길이가 늘어나는 무한의 배열 만들기 (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();
}
}
끝!
반응형
'Dev Story 💻 > Java' 카테고리의 다른 글
[Java] class(클래스) 이해를 위한 예제 -1 (객체지향 겉핥기) (0) | 2021.12.01 |
---|---|
[Java] int를 String으로, String을 int으로 (0) | 2021.11.30 |
[Java] Self-number 알고리즘과 합 (0) | 2021.11.27 |
[Java] Random Class, Math Class를 이용하여 무작위 숫자 출력하기 (0) | 2021.11.24 |
[Java] 배열을 이용한 선택 정렬 알고리즘 (0) | 2021.11.24 |
댓글