[알고리즘] 순환(Recursion) 08 - 중첩 반복문 대체하기

1 minute read

순환(Recursion) - 중첩 반복문 대체하기

알고리즘 문제해결 전략

Java코드

import java.util.ArrayList;

public class Test {

	public static void main(String[] args) {
		ArrayList<Integer> picked = new ArrayList<Integer>();
		pick(4, picked, 3);
	}

	// n : 전체 원소의 수
	// picked : 지금까지 고른 원소들의 번호
	// toPick : 더 고를 원소의 수
	// 일때 앞으로 toPik 개의 원소를 고르는 모든 방법을 출력

	public static void pick (int n, ArrayList<Integer> picked, int toPick) {
		// 베이스케이스 : 더 고를 원소가 없으면 고른 원소들을 출력
		if(toPick==0) {
			System.out.println("완료 : " +picked);
			return;
		}

		// 고를 수 있는 가장 작은 번호를 계산
		int smallest = picked.isEmpty() ? 0 : picked.get(picked.size()-1) +1;

		//이 단계에서 원소 하나를 고른다
		for (int i = smallest; i < n; i++) {
			picked.add(i);
			pick(n, picked, toPick-1);
			System.out.println(picked);
			picked.remove(picked.size()-1);
		}
	}
}
완료 : [0, 1, 2]
[0, 1, 2]
완료 : [0, 1, 3]
[0, 1, 3]
[0, 1]
완료 : [0, 2, 3]
[0, 2, 3]
[0, 2]
[0, 3]
[0]
완료 : [1, 2, 3]
[1, 2, 3]
[1, 2]
[1, 3]
[1]
[2, 3]
[2]
[3]

생각

재귀는 아직도 복잡하고 어렵게 느껴진다
좀 더 연습이 필요

재귀에서 탈출하는 베이스 케이스를 생각!!
즉, ‘더이상 쪼개지지 않는 최소한의 작업’에 도달했을 때 답을 반환하는 조건문을 포함해야함

Logic

재귀는 완전탐색으로 구할 때 아주 좋은 방법
매 단계에서 하나의 원소를 추가, 그리고 만족하는 답을 출력
다시 이전으로 돌아가서 원소를 추가하는 식으로 진행
중첩 for문과 달리 n개의 원소 중 몇 개를 고르든지 사용할 수 있는 장점