티스토리 뷰

www.acmicpc.net/problem/15652

 

15652번: N과 M (4)

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

www.acmicpc.net

 

이 문제는 중복 조합을 구하는 문제입니다.

기존 조합을 구현한 코드에서 다음에 선택할 수 있는 수의 시작 위치를 선택한 수의 다음이 아닌 지금 선택한 수부터 가능하도록 하여 구현할 수 있습니다.

 

자바 코드는 다음과 같습니다.

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");

        int n = Integer.parseInt(input[0]);
        int m = Integer.parseInt(input[1]);

        combination(new int[n], n, m, 0, 0);
    }

    // 중복 조합 구하기
    // 선택된 수 배열, 전체 수, 뽑아야하는 수 개수, 시작 인덱스, 실제 선택한 개수
    private static void combination(int[] nums, int n, int m, int start, int k) {
        // m개를 모두 선택한 경우 선택된 수 출력
        if (k == m) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < k; i++) {
                sb.append(nums[i]).append(" ");
            }
            System.out.println(sb);
            return;
        }

        // start부터 하나씩 선택하면서 수 배열에 저장
        for (int i = start; i < n; i++) {
            nums[k] = i + 1;
            combination(nums, n, m, i, k + 1);  // i를 뽑았기 때문에 뽑은 수 k+1, 다시 i부터 뽑을 수 있으므로 i 전달 
        }
    }
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함