15657번: N과 M (8)
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열
www.acmicpc.net
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
public class Main {
static int N, M, A[], R[];
static Set<String> s = new HashSet<>();
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());
A = new int[N];
R = new int[M];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(A);
combination(0, 0);
}
static void combination(int start, int cnt) {
if (cnt == M) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < M; i++) {
sb.append(R[i]).append(" ");
}
sb.append("\n");
String result = sb.toString();
if (!s.contains(result)) {
System.out.print(result);
s.add(result);
}
return;
}
for (int i = start; i < N; i++) {
R[cnt] = A[i];
combination(i, cnt + 1);
}
}
}
풀이
우선 조합 알고리즘을 재귀로 구성했다.
기저조건에 도달할 경우, 백트래킹을 통해 재귀 호출을 중단하고 출력 조건에 해당하는지 검사한다.
검사는 출력 결과를 모아놓은 집합에 해당 문자열이 있는지를 체크하는 방식으로 진행했다.
출력 조건에 해당하면 결과를 출력하고 출력 목록을 저장하는 집합에 저장하여 문제를 해결할 수 있었다.
728x90
'알고리즘 > 백트래킹' 카테고리의 다른 글
[백준][JAVA] 15655번 N과 M (6) (0) | 2024.03.06 |
---|---|
[백준][JAVA] 16987번 계란으로 계란치기 (0) | 2024.02.22 |
[백준][JAVA] 15666번 N과 M (12) (1) | 2024.01.26 |
[백준][JAVA] 15663번 N과 M (9) (1) | 2023.12.21 |
[백준][JAVA] 2023번 신기한 소수 (0) | 2023.12.18 |