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 반복 멈춤
}
}
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] + " ");
}
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);
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] + " ");
}
로또 번호 자동 생성기 프로그램을 만들기.
(중복 값 없이 오름차순으로 정렬하여 출력하세요.)
[실행 화면]
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));
문자열을 입력 받아 문자열에 어떤 문자가 들어갔는지 배열에 저장하고
문자의 개수와 함께 출력하세요.
[실행 화면]
문자열 : 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);
사용자가 입력한 배열의 길이만큼의 문자열 배열을 선언 및 할당하고
배열의 인덱스에 넣을 값 역시 사용자가 입력하여 초기화 하세요.
단, 사용자에게 배열에 값을 더 넣을지 물어보고 몇 개를 더 입력할 건지,
늘린 곳에 어떤 데이터를 넣을 것인지 받으세요.
사용자가 더 이상 입력하지 않겠다고 하면 배열 전체 값을 출력하세요.
[실행 화면]
배열의 크기를 입력하세요 : 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));