Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP에서 단일 집합으로부터 특정 크기의 모든 조합 생성하기

PHP에서 하나의 집합으로부터 특정 크기의 모든 조합을 생성해야 하는 경우가 종종 있습니다. 예를 들어, ['a', 'b', 'c']라는 문자 집합에서 길이가 2인 모든 조합을 뽑아내는 작업이 그렇습니다. 이는 재귀 함수를 활용하면 간단하게 구현할 수 있으며, 아래 코드를 통해 확인할 수 있습니다.

예제 코드

function sampling($chars, $size, $combinations = array()) {
    # 첫 번째 반복인 경우, 첫 조합 집합은 문자 집합과 동일합니다
    if (empty($combinations)) {
        $combinations = $chars;
    }
    # 크기가 1이면 모든 조합 생성이 완료된 것입니다
    if ($size == 1) {
        return $combinations;
    }
    # 새로운 조합을 저장할 배열을 초기화합니다
    $new_combinations = array();
    # 기존 조합과 문자 집합을 순회하며 새로운 문자열을 생성합니다
    foreach ($combinations as $combination) {
        foreach ($chars as $char) {
            $new_combinations[] = $combination . $char;
        }
    }
    # 다음 반복을 위해 동일한 함수를 재귀적으로 호출합니다
    return sampling($chars, $size - 1, $new_combinations);
}
$chars = array('a', 'b', 'c');
$output = sampling($chars, 2);
var_dump($output);

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

array(9) { [0]=> string(2) "aa" [1]=> string(2) "ab" [2]=> string(2) "ac" [3]=> string(2) "ba" [4]=> string(2) "bb" [5]=> string(2) "bc" [6]=> string(2) "ca" [7]=> string(2) "cb" [8]=> string(2) "cc" }

코드 동작 원리

이 코드의 핵심은 재귀(recursion)를 활용한 방식입니다. 동작 과정을 단계별로 살펴보면 다음과 같습니다.

1. 초기 조합 설정 — 함수가 처음 호출될 때는 조합 배열이 비어 있으므로, 기본 조합 집합을 문자 집합 그대로 설정합니다. 즉, ['a', 'b', 'c']가 첫 번째 조합이 됩니다.

2. 종료 조건 확인 — 요청된 크기($size)가 1이면 더 이상 조합을 확장할 필요가 없으므로 현재까지 만들어진 조합을 그대로 반환합니다.

3. 조합 확장 — 새로운 조합을 담을 배열($new_combinations)을 초기화한 뒤, 이중 foreach 루프를 통해 기존의 각 조합에 문자 집합의 모든 문자를 하나씩 이어 붙여 새로운 조합을 만듭니다.

4. 재귀 호출 — 크기를 하나 줄인 상태로 'sampling' 함수를 다시 호출하여, 원하는 크기에 도달할 때까지 위 과정을 반복합니다.

결과적으로 문자 3개로 크기 2의 조합을 만들면 3 × 3 = 9개의 조합이 생성됩니다. 이 방식은 문자열 패턴 생성, 비밀번호 조합 탐색, 테스트 케이스 자동 생성 등 다양한 상황에서 유용하게 활용할 수 있습니다.