Algorithm/java

백준 1497 JAVA : 기타콘서트

yeeeooonn 2024. 2. 15. 15:38

문제

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;
    }
}

 

결과