문제
https://www.acmicpc.net/problem/16457
16457번: 단풍잎 이야기
첫째 줄에 키의 개수 n, 퀘스트의 개수 m, 퀘스트 당 사용해야 하는 스킬의 수 k가 주어진다. n은 10 이하, k는 n 이하의 양의 정수이며, m은 100 이하의 양의 정수이다. 둘째 줄부터 m개의 줄에는 각각
www.acmicpc.net
풀이 예상
완전탐색 => 모든 숫자들의 조합을 만들어서 퀘스트를 몇 번 할 수 있는지 세 본다.
풀이방법 (접근 방법 & 시간복잡도)
시간복잡도 => O(2^n)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main_16457 {
static int n, m, k, answer;
static List<Integer>[] list;
static boolean[] visited;
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());
k = Integer.parseInt(st.nextToken());
list = new ArrayList[m];
for (int i = 0; i < m; i++) {
list[i] = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for (int j = 0; j < k; j++) {
list[i].add(Integer.parseInt(st.nextToken()));
}
}
visited = new boolean[2*n+1];
answer = 0;
combi(0,1);
System.out.println(answer);
}
static void combi(int depth, int start) {
if(depth == n) {
int result = 0;
for (int i = 0; i < m; i++) {
int count = 0;
for (int j = 0; j < k; j++) {
if(visited[list[i].get(j)]) count++;
}
if(count == k) result++;
}
answer = Math.max(answer, result);
return;
}
for (int i = start; i <= 2*n; i++) {
visited[i] = true;
combi(depth+1, i+1);
visited[i] = false;
}
}
}
결과
'Algorithm > java' 카테고리의 다른 글
백준 1107 JAVA : 리모컨 (0) | 2024.02.15 |
---|---|
백준 1497 JAVA : 기타콘서트 (0) | 2024.02.15 |
백준 9663 JAVA : N-Queen (0) | 2024.02.04 |
백준 2661 JAVA : 좋은수열 (1) | 2024.02.04 |
백준 2529 JAVA : 부등호 (1) | 2024.02.04 |