본문 바로가기

Java Programming

잊고 지내던 Recursive 다시 해보다.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

최근 모 회사의 필기시험을 보다보니까 Recursive (재귀호출) 을 이용해서 과제를 해결하라는 식의 문제가 나왔다.
정확히 문제가 기억은 나지 않지만 개략적으로 이러했다.

랜덤한 숫자를 임의의 갯수만큼 뽑는데 뽑는 숫자가 겹치지 않아야 한다.

라는게 문제였다. 연필과 종이 위에 써내려갈려니 도무지 답이 잘 써지지 않아서 뭐라고 썼는지 기억도 잘 안난다.
근데 이클립스를 켜고 코딩을 해보니 생각보다 술술 됐다.

import java.util.Random;

public class DataUtil {
	public static int[] getRandomArray(int size) {
		return createArray(new int[size], size, 0);
	}

	public static void displayArray(int[] arr, int index) {
		if (arr.length != index) {
			System.out.print("[\t" + arr[index] + "\t] ");
			displayArray(arr, ++index);
		}
	}

	private static int[] createArray(int[] arr, int size, int index) {
		if (index == size - 1) {
			return arr;
		} else {
			int value = new Random().nextInt(size);
			if (!hasValue(arr, value, 0)) {
				arr[index] = value;
				index += 1;
			}
			return createArray(arr, size, index);
		}
	}

	private static boolean hasValue(int[] arr, int value, int index) {
		if (arr.length == index) {
			return false;
		} else {
			if (arr[index] != value)
				return hasValue(arr, value, ++index);
			else
				return true;
		}
	}
}


Recursive 를 실제로 업무를 하면서 구현해볼 기회는 단 한번도 없었지만.. 우리가 for 나 while 같은 반복문을 사용하면서 간과했던건 Recursive가 주는 교훈이 아니었나.. 싶다.. (굳이 미화를 하자면..) Recursive의 핵심은 구현하는데 있는게 아니라.. 반복되는 규칙의 종료 조건과 평소 API에서 자동으로 자 처리해주는 알고리즘들에 대해서 다시한번 생각할 수 있도록 도와주는 역할이지 않나 하는 생각이 든다.