문제
https://www.acmicpc.net/problem/1497
1497번: 기타콘서트
첫째 줄에 기타의 개수 N과 곡의 개수 M이 주어진다. N은 10보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 기타의 이름과 기타가 연주할 수 있는 곡의
www.acmicpc.net
풀이 예상
기타를 쓸 수 있는 개수가 명시되어 있지 않기 때문에 부분집합을 사용해서 선택한다, 안한다로 기타의 조합을 만든다.
음악을 얼마나 연주할 수 있는지 계산하고 답을 갱신한다.
풀이방법 (접근 방법 & 시간복잡도)
시간복잡도 => O(2^n)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N,M;
static boolean[] select;
static boolean[][] check;
static int answer = Integer.MAX_VALUE;
static int total;
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());
select = new boolean[N];
check = new boolean[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
String name = st.nextToken();
String result = st.nextToken();
for (int j = 0; j < M; j++) {
char c = result.charAt(j);
if(c == 'Y') check[i][j] = true;
}
}
//부분집합
subset(0, 0); //깊이, 카운트
if(answer == 0){
System.out.println(-1);
}else {
System.out.println(answer);
}
}
static void subset(int depth, int count) {
if(depth == N) {
int mCount = musicCount(); //음악을 얼마나 연주 가능한지
if (total < mCount) { //total : 현재까지 나온 음악 최대 수
total = mCount;
answer = count;
}else if(total == mCount) {
answer = Math.min(answer, count);
}
return;
}
//선택함
select[depth] = true;
subset(depth+1, count+1);
//선택안함
select[depth] = false;
subset(depth+1, count);
}
private static int musicCount() {
int count = 0;
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if(select[j] && check[j][i]) {
count++;
break;
}
}
}
return count;
}
}
결과
'Algorithm > java' 카테고리의 다른 글
백준 15486 JAVA : 퇴사 2 (0) | 2024.02.18 |
---|---|
백준 1107 JAVA : 리모컨 (0) | 2024.02.15 |
백준 16457 JAVA : 단풍잎 이야기 (0) | 2024.02.15 |
백준 9663 JAVA : N-Queen (0) | 2024.02.04 |
백준 2661 JAVA : 좋은수열 (1) | 2024.02.04 |