반응형
https://www.acmicpc.net/problem/15666
[풀이과정]
중복되는 부분을 어떻게 해결해야 하는지 고민하다가 시간이 오래 걸렸음.
DFS로 재귀호출 시에 for문 시작 index를 이전 DFS와 같게 하되 배열[index]의 값이 다른 경우에만 값을 sb에 넣게 했다.
이렇게 해야 중복 없는 수열이 나옴.
[코드]
import java.util.*;
import java.lang.*;
import java.io.*;
/*
N개 중 M개 고르기
중복 가능
오름차순
*/
class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static int N, M;
static int[] A;
static int[] selected;
public static void main(String[] args) throws IOException{
init();
/*
[출력]
한 줄에 하나씩 수열 출력. 중복 수열은 한 번만 출력.
*/
DFS(0,0);
System.out.print(sb);
}
public static void init() throws IOException{
/*
[입력]
1. N, M (1<=M,N<=8)
2. N개의 수 (1<=크기<=10,000)
*/
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
A = new int[N];
st = new StringTokenizer(br.readLine());
for(int n = 0; n < N; n++){
A[n] = Integer.parseInt(st.nextToken());
}
//오름차순 정렬
Arrays.sort(A);
selected = new int[M];
}
public static void DFS(int start, int depth){
if(depth == M){
for(int m = 0; m < M; m++){
sb.append(selected[m]).append(" ");
}
sb.append('\n');
return;
}
int prevNum = -1;
for(int i = start; i < N; i++){
if(prevNum != A[i]){
selected[depth] = A[i];
prevNum = A[i];
DFS(i, depth+1);
}
}
}
}

반응형
'백준 > DFS BFS' 카테고리의 다른 글
[백준] 14940 : 쉬운 최단거리 (JAVA) (0) | 2025.04.01 |
---|---|
[백준] 2668 : 숫자고르기 (JAVA) (0) | 2024.11.22 |
[백준] 16637 : 괄호 추가하기 (JAVA) (0) | 2024.11.15 |
[백준] 1240 : 노드 사이의 거리 (JAVA) (0) | 2024.11.09 |
[백준] 1068 : 트리 (JAVA) (0) | 2024.11.01 |