반응형
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 512 MB | 11366 | 5747 | 4104 | 49.215% |
문제
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- N개의 자연수 중에서 M개를 고른 수열
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
예제 입력 1
3 1
4 4 2
예제 출력 1
2
4
예제 입력 2
4 2
9 7 9 1
예제 출력 2
1 7
1 9
7 1
7 9
9 1
9 7
9 9
예제 입력 3
4 4
1 1 1 1
예제 출력 3
1 1 1 1
코드
/*
이전 문제와 다른 점은
자신을 제외한 모든 조합, 하지만 중복되는 수열은 여러 번 출력하면 안된다.
출력값을 String으로 변경해 Set에 넣어 중복을 제거해야한다.
💡 LinkedHashSet이 아닌 TreeSet을 사용하면 안되는 이유
둘 다 정렬이 가능한 Set이라는 점은 동일하지만 LinkedHashSet은 입력순으로 정렬되고, TreeSet은 생성시 인자로 Comparator를 넘겨주지 않는다면 기본적으로 오름차순 정렬한다.
따라서, TreeSet을 사용하면 String을 기준으로 오름차순 정렬하기 때문에 기존에 숫자가 작은순으로 오름차순 정렬했던 순서가 깨지게 된다.
ex) "16", "135" → "135", "16"
*/
import java.io.*;
import java.util.*;
public class p15663 {
static int n, m;
static int[] arr, result;
static boolean[] visit;
static StringBuilder sb = new StringBuilder();
static LinkedHashSet<String> ans;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
arr = new int[n];
result = new int[m];
visit = new boolean[n];
ans = new LinkedHashSet<>();
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
dfs(0);
ans.forEach(System.out::println);
}
static void dfs(int depth) {
if (depth == m) {
StringBuilder sb = new StringBuilder();
for (int p : result) {
sb.append(p).append(" ");
}
ans.add(sb.toString());
return;
}
for (int i = 0; i < n; i++) {
if (!visit[i]) {
visit[i] = true;
result[depth] = arr[i];
dfs(depth + 1);
visit[i] = false;
}
}
}
}
반응형
'알고리즘 > [ Baekjoon ]' 카테고리의 다른 글
[ BOJ ][JAVA][15665] N과 M(11) (0) | 2021.05.07 |
---|---|
[ BOJ ][JAVA][15664] N과 M(10) (0) | 2021.05.07 |
[ BOJ ][JAVA][1103] 게임 (0) | 2021.05.07 |
[ BOJ ][JAVA][10714] 케이크 자르기 2 (0) | 2021.05.07 |
[ BOJ ][JAVA][11062] 카드 게임 (0) | 2021.05.07 |