www.acmicpc.net/problem/15665

 

15665번: N과 M (11)

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

www.acmicpc.net

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

 

1. 입력받은 N개 중 M개의 숫자를 고른 수열

2. 숫자는 중복하여 사용될 수 있다.

3. 같은 수열의 같은 자리에 대해서는 숫자의 중복이 허용되지 않는다. 즉, 중복 수열은 허용하지 않는다.

 

 

 

codeung.tistory.com/60?category=449370

 

[BJ] N과 M (9) JAVA

www.acmicpc.net/problem/15663 15663번: N과 M (9) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열

codeung.tistory.com

N과 M (9) 에서 숫자 중복 사용 가능 조건으로 변경된 문제

 

 

 

 

풀이 .

import java.util.*;
import java.io.*;

public class Main {
    static BufferedReader br = null;
    static BufferedWriter bw = null;
    static StringTokenizer st = null;
    static StringBuilder sb = null;
    static int[] permu = null;
    static int[] num = null;
    static int n, m;

    public static void dfs(int dept, int deptNow) {
        if (dept == deptNow) {
            for (int i = 0; i < dept; i++) {
                sb.append(permu[i]).append(' ');
            }
            sb.append('\n');
            return;
        }

        Set<Integer> used = new HashSet<>();
        for (int i = 0; i < n; i++) {
            if (!used.contains(num[i])) {
                permu[deptNow] = num[i];
                used.add(num[i]);
                dfs(dept, deptNow + 1);
            }
        }
    }

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        bw = new BufferedWriter(new OutputStreamWriter(System.out));
        st = new StringTokenizer(br.readLine());
        sb = new StringBuilder();
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        permu = new int[m + 1];
        num = new int[n];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            num[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(num);

        Set<Integer> used = new HashSet<>();
        for (int i = 0; i < n; i++) {
            if (!used.contains(num[i])) {
                permu[0] = num[i];
                used.add(num[i]);
                dfs(m, 1);
            }
        }

        bw.write(sb.toString());
        bw.flush();
        bw.close();
    }
}

 

기존 코드에서 boolean[] check 를 제거하여 해결

 

 

'알고리즘 문제 > 백준 온라인 저지' 카테고리의 다른 글

[BOJ] 2557 - Hello World! JAVA  (0) 2021.01.08
[BOJ] 15666 - N과 M (12) JAVA  (0) 2021.01.07
[BOJ] 15664 - N과 M (10) JAVA  (0) 2021.01.07
[BOJ] 15663 - N과 M (9) JAVA  (0) 2021.01.07
[BOJ] 15657 - N과 M (8) JAVA  (0) 2021.01.07

+ Recent posts