가자미의 개발이야기
[JAVA] 자바 재귀함수 활용 예시 본문
대학교 과제로 이런 문제가 나왔다.
8번. 실행 예와 같이 키보드로부터 배열의 크기를 입력 받아서 배열 생성, 이 곳에 1에서 100까지 범위의 정수를 램덤 삽입하고 화면 출력. 배열에는 동일한 수가 없도록 하자.
실해 예)
정수 몇개?7
57 67 34 91 81 18 31
그래서 나는 재귀함수를 활용해 풀려고 했다.
import java.util.Scanner;
import java.util.Random;
public class Practice8 {
static int[] arrayStatement(int num) {
int array[] = new int[num];
return array;
}
static int arrayRandomGet(int[] array) {
Random random = new Random();
int num = random.nextInt(100)+1;
for (int i=0;i<array.length; i++) {
if (array[i]==num) {
arrayRandomGet(array);
}
else
continue;
}
return num;
}
static void arrayInput(int[] array, int num) {
for(int i=0; i<array.length;i++) {
if(array[i]==0) {
array[i]=num;
break;
}
}
}
static void arrayPrint(int[] array) {
for (int i=0; i<array.length;i++) {
System.out.printf("%d ", array[i]);
}
}
public static void main(String[] args ) {
Scanner inputNum = new Scanner(System.in);
System.out.printf("정수가 몇개? : ");
int[] array=arrayStatement(inputNum.nextInt());
for(int i =0; i<array.length;i++) {
int num =arrayRandomGet(array);
arrayInput(array, num);
}
arrayPrint(array);
inputNum.close();
}
}
여기서 문제가 생겼다.
배열에는 중복된 숫자가 원소로 있으면 안되는데
중복된 원소를 갖는 배열이 나오는 문제가 생겼다.
코드를 찬찬히 살펴보니
내가 재귀함수로 만든 arrayRandomGet 메소드에서 문제가 생김을 알 수 있었다.
static int arrayRandomGet(int[] array) {
Random random = new Random();
int num = random.nextInt(100)+1;
for (int i=0;i<array.length; i++) {
if (array[i]==num) {
arrayRandomGet(array);
}
else
continue;
}
return num;
}
이게 왜 문제라는 걸까...
한 삼십분을 생각해봤지만 잘 모르겠어서 재귀 함수 관련 포스트를 찾아보고 공부했다...
중요한건 바로 if절에 있는 arrayRandomGet(array). 즉 재귀함수를 잘못 활용하고 있었다.
if절에 저렇게 쓴 이유는 동일한 원소를 발견하면 다시 랜덤한 수를 새로 찾아서 다른 수를 반환해주기를 바래서 였다.
즉 arrayRandomGet이 어떤 임의의 수가 중복됐음을 알았다면 또다른 arrayRandomGet을 실행한다.
근데 문제는 arrayRandomGet의 작용방식이었다.
arrayRandomGet은 랜덤한 수 num을 배열 원소 하나하나와 비교하고
같은 값이 있으면 다른 arrayRandomGet을,
그렇지 않으면 처음에 정한 랜덤한 수를 반환하는 방식으로 작용한다.
정말 짧게 말하면. 그냥 int형을 반환하는 어떤 함수다.
코딩 실력이 좋은 사람들은 이미 파악했겠지만,
만약 메소드가 중복된 수로 비교하고 있어서 두번째 메소드를 호출해도
두번째 메소드는 그냥 int형 수를 의미한다.(반환형이 int니까..)
즉 기존의 메소드의 반환형인 num에 아무런 영향을 끼치지 못한다.
두번째 메소드가 원래 비교하던 중복된 수를 바꿔주지 못한다는 의미다
따라서 이를 고치려면
static int arrayRandomGet(int[] array) {
Random random = new Random();
int num = random.nextInt(100)+1;
for (int i=0;i<array.length; i++) {
if (array[i]==num) {
num=arrayRandomGet(array);
}
else
continue;
}
return num;
}ㅁㅁ
num=을 붙여줘서 중복된 수는 다시 arrayRandomGet으로 할당해줘서 다시 num을 반환해야 한다!!
'Java > 자바 기본 문법' 카테고리의 다른 글
[Java] Iterator, ListIterator (0) | 2021.06.28 |
---|---|
[Java] Scanner의 NoSuchElementException 오류 (0) | 2021.05.25 |
[자바] jdk 설치 이후 디렉토리 구조 (0) | 2021.03.02 |
[자바] 컬렉션 인스턴스 동기화 (0) | 2021.03.02 |
[자바] 쓰레드를 생성하는 더 좋은 방법 (0) | 2021.03.02 |