[백준] 1497: 기타콘서트 - JAVA

https://www.acmicpc.net/problem/1497

풀이

처음에는 기타마다 연주할 수 있는 곡을 비트마스킹으로 체크하려고 했으나 곡의 개수가 최대 50까지 되기 때문에 int범위에서 비트마스킹을 할 수 없었다.

따라서 boolean 이차원 배열을 만들어 체크했다.

N개의 기타로 만들 수 있는 조합을 모두 만들어 연주할 수 있는 곡을 체크해줬다.

비트마스킹을 사용하려고 했던 것이 아쉬워 조합을 만들 때 비트마스킹을 이용했다.

for (int i = 1; i < (1 << N); i++) {
    int sel = 0;
    for (int j = 0; j < N; j++) {
        if ((i & (1 << j)) != 0) {
            sel |= (1 << j);
        }
    }

    countSong(sel);
}

1부터 2의 N제곱까지의 자연수 중 비트의 자리수가 1인 것이 선택된 기타이다.


메모리: 14548KB

시간: 136ms

언어: Java 11

코드

import java.util.*;
import java.io.*;

public class Main {

    static int N, M, max, ans;
    static boolean[][] guitar;

    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());

        guitar = new boolean[N][M];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            String name = st.nextToken();
            String song = st.nextToken();

            for (int j = 0; j < M; j++) {
                if (song.charAt(j) == 'Y') {
                    guitar[i][j] = true;
                }
            }
        }

        max = 0;
        ans = -1;

        combi();

        System.out.println(ans);
    }

    private static void combi() {
        for (int i = 1; i < (1 << N); i++) {
            int sel = 0;
            for (int j = 0; j < N; j++) {
                if ((i & (1 << j)) != 0) {
                    sel |= (1 << j);
                }
            }

            countSong(sel);
        }
    }

    private static void countSong(int sel) {
        boolean[] tmp = new boolean[M];
        for (int i = 0; i < N; i++) {
            if ((sel & (1 << i)) != 0) {
                for (int j = 0; j < M; j++) {
                    if (guitar[i][j]) {
                        tmp[j] = true;
                    }
                }
            }
        }

        int cnt = 0;
        for (int i = 0; i < M; i++) {
            if (tmp[i]) {
                cnt++;
            }
        }

        if (cnt == max) {
            ans = Math.min(ans, Integer.bitCount(sel));
        } else if (cnt > max) {
            max = cnt;
            ans = Integer.bitCount(sel);
        }
    }

}