[Java] 백준 15657번 N과 M (9)
2022. 3. 2. 10:22
728x90
https://www.acmicpc.net/problem/15663
15663번: N과 M (9)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
이번 문제는 중복만 제거해주면 순열로 쉽게 풀립니다.
다만, 고민했던 부분은 HashSet으로 중복제거를 해줬지만 HashSet은 정렬이 안된다는 점입니다.
구글링을 통해 LinkedHashSet이 입력 순서대로 정렬된다라는 것을 알게되었습니다.
package BJ;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.StringTokenizer;
public class BJ_N과M9 {
static int N, M;
static int[] src;
static int[] tgt;
static boolean[] select;
static LinkedHashSet<String> result; // 입력 순으로 정렬 됨
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
src = new int[N];
tgt = new int[M];
select = new boolean[N];
result = new LinkedHashSet<>();
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
src[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(src);
perm(0);
result.forEach(System.out :: println);
}
private static void perm(int tgtIdx) {
if(tgtIdx == tgt.length) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tgt.length; i++) {
sb.append(tgt[i]).append(' ');
}
result.add(sb.toString());
return;
}
for (int i = 0; i < select.length; i++) {
if(select[i]) continue;
tgt[tgtIdx] = src[i];
select[i] = true;
perm(tgtIdx + 1);
select[i] = false;
}
}
}
반응형
'알고리즘' 카테고리의 다른 글
[Java] 백준 11660번 구간 합 구하기 5 (0) | 2022.03.04 |
---|---|
[Java] 백준 15657번 N과 M (12) (0) | 2022.03.03 |
[Java] 백준 15657번 N과 M (8) (0) | 2022.03.01 |
[Java] 백준 15654번 N과 M (5) (0) | 2022.02.28 |
[Java] 백준 15652번 N과 M (4) (0) | 2022.02.27 |