공부/ALGORITHM

순열과 중복순열

5월._. 2022. 2. 20.
728x90

순열

중복을 제거하기 때문에 flag가 필요하다. cnt가 M(총 뽑아야 하는 개수)과 동일하면 끝낸다.

0부터 N(뽑을 수 있는 수의 개수)까지 중에서 이미 뽑은 수를 제외하고 해당 순서에 숫자를 저장한다.(순열 저장 배열)

다시 재귀로 다음 순서부터 순열을 찾는다.

private static void findP(int cnt, int flag) {
    if(cnt==M) {
        for(int i=0;i<M;i++){
            sb.append(numbers[i]).append(" ");
        }
        sb.append("\n");
        return;
    }

    for(int i=0;i<N;i++){
        if((flag&1<<i) != 0) continue;
        numbers[cnt] = i+1;
        findP(cnt+1,flag|1<<i);
    }
}

 

중복순열

0부터 N(뽑을 수 있는 수의 개수)까지 중에서 중복 상관없이 순열 저장 배열의 해당 순서에 숫자를 저장한다. 

다시 재귀로 다음 순서부터 순열을 찾는다.

private static void findP(int cnt) {
    if(cnt==M) {
        for(int i=0;i<M;i++){
            sb.append(numbers[i]).append(" ");
        }
        sb.append("\n");
        return;
    }

    for(int i=0;i<N;i++){
        numbers[cnt] = i+1;
        findP(cnt+1);
    }
}

 

관련 문제

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

 

15651번: N과 M (3)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

'공부 > ALGORITHM' 카테고리의 다른 글

부분집합  (0) 2022.04.08
조합과 중복조합  (0) 2022.02.20

댓글