
🧫 문제 분석
✔️ 출처
📖 문제

N과 M 9번째 시리즈
N개의 자연수 중 M개를 고른 수열이면서 그 수열이 중복되면 안된다.
입력받은 N개의 자연수를 우선 오름차순으로 정렬한 후
백트래킹 탐색을 한다.
수열을 문자열로 만들고
Set에 중복 체크를 한 다음 없다면
Queue에 넣어서 저장
탐색이 끝나면
Queue를 다 꺼내서 출력하면 된다.
🔅 문제 풀이
import java.io.*;
import java.util.*;
public class Main {
static Set<String> set = new HashSet<>(); // 수열 중복 체크
static StringBuilder sb = new StringBuilder(); // 수열 만들기용
static List<Integer> list = new ArrayList<>(); // m개 뽑은 수를 저장
static Queue<String> q = new LinkedList<>(); // 답을 저장
static boolean[] visited;
static int[] seq;
static int n;
static int m;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
visited = new boolean[n];
seq = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
seq[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(seq);
backtracking();
while (!q.isEmpty()) {
sb.append(q.poll()).append("\n");
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
private static void backtracking() {
// 길이가 m이 됐다면
if (list.size() == m) {
// 수열 만들기
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i)).append(" ");
}
// 중복체크
if (!set.contains(sb.toString())) {
set.add(sb.toString());
q.add(sb.toString());
}
sb.delete(0, sb.length()); // 임시로 만든 수열 지우기
return;
}
//백트래킹
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
list.add(seq[i]);
visited[i] = true;
backtracking();
list.remove(list.size() - 1);
visited[i] = false;
}
}
}
❗ 오답노트 / 필요한 지식
'baekjoon > Brute_Force' 카테고리의 다른 글
백준 18111번 : 마인크래프트 [자바] (0) | 2025.04.19 |
---|---|
백준 9663번 : N-Queen [자바] (0) | 2025.04.16 |
백준 1436번 : 영화감독 숌 자바 (0) | 2024.09.01 |
백준 1027번 : 고층건물 자바 (2) | 2024.07.22 |
백준 1038번 : 감소하는 수 자바 (0) | 2024.07.18 |