티스토리 뷰

www.acmicpc.net/problem/15651

 

15651번: N과 M (3)

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

www.acmicpc.net

 

이 문제는 중복이 가능한 순열을 통해 해결할 수 있습니다.

 

즉, 일반 순열에서 수를 선택했는지 안했는지 확인하는 부분을 제거하고 매 depth마다 모든 수를 앞에서부터 선택하여 숫자 배열에 추가하고 depth가 m이랑 같아질 때 선택했던 수들을 순서대로 출력하면 됩니다.

 

depth가 m이랑 같을 때 바로 수를 출력하려고 했더니 시간 초과가 나서 StringBuilder를 사용하여 출력할 수들을 저장해두고 최종적으로 한번만 출력할 수 있도록 했습니다.

 

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

 

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]);

        System.out.println(permutation(new int[n], n, m, 0));
    }

    private static StringBuilder permutation(int[] nums, int n, int m, int depth) {
        StringBuilder sb = new StringBuilder();

        // m개를 모두 선택한 경우
        if (depth == m) {
            for (int i = 0; i < depth; i++) {
                sb.append(nums[i]).append(" ");
            }
            return sb.append("\n");
        }

        // 매 depth마다 가장 처음 수부터 선택
        for (int i = 0; i < n; i++) {
            nums[depth] = i + 1;  // 선택 여부 확인 없이 바로 수를 선택하고
            sb.append(permutation(nums, n, m, depth + 1));  // depth 증가 (선택한 수 증가)
        }

        return sb;
    }
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함