[Boj_1497] ๊ธฐํƒ€์ฝ˜์„œํŠธ

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

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

 

โ–ธ ๋ฌธ์ œ

๊ฐ•ํ† ๋Š” Day Of Mourning์˜ ๊ธฐํƒ€๋ฆฌ์ŠคํŠธ๋กœ, ๋‹ค๊ฐ€์˜ค๋Š” ๊ณต์—ฐ์„ ์ค€๋น„ํ•˜๊ณ  ์žˆ๋‹ค.

์–ด๋А ๋‚  ๊ฐ•ํ† ์˜ ์ง‘์— ๋„๋‘‘์ด ๋“ค์–ด์„œ ๊ธฐํƒ€๋ฅผ ๋ชจ๋‘ ๋„๋‘‘๋งž๊ณ  ๋ง์•˜๋‹ค. ๊ธฐํƒ€๋ฅผ ์‚ฌ์•ผ ํ•œ๋‹ค.

๊ฐ•ํ† ๋Š” ๊ณต์—ฐ ๋•Œ ์—ฐ์ฃผํ•  ๋…ธ๋ž˜์˜ ๋ชฉ๋ก์„ ๋ฝ‘์•„ ๋†“์•˜๋‹ค. ํ•˜์ง€๋งŒ, ํ•˜๋‚˜์˜ ๊ธฐํƒ€๋กœ ๋ชจ๋“  ๊ณก์„ ์—ฐ์ฃผํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์–ด๋–ค ๊ธฐํƒ€๋Š” ์–ด๋–ค ๊ณก์„ ์—ฐ์ฃผํ•  ๋•Œ, ์ด์ƒํ•œ ์†Œ๋ฆฌ๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•ญ์ƒ ์™„๋ฒฝ์„ ์ถ”๊ตฌํ•˜๋Š” ๊ฐ•ํ† ๋Š” ์ด๋Ÿฐ ์ผ์„ ์šฉ๋‚ฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ตœ๋Œ€ํ•œ ๋งŽ์€ ๊ณก์„ ์ œ๋Œ€๋กœ ์—ฐ์ฃผํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ํ•„์š”ํ•œ ๊ธฐํƒ€์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ˆ๋ฅผ ๋“ค์–ด, GIBSON์œผ๋กœ 1, 2, 3๋ฒˆ ๊ณก์„ ์ œ๋Œ€๋กœ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๊ณ , FENDER๋กœ 1, 2, 5๋ฒˆ ๊ณก์„ ์ œ๋Œ€๋กœ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๊ณ , EPIPHONE์œผ๋กœ 4, 5๋ฒˆ ๊ณก์„ ์ œ๋Œ€๋กœ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๊ณ , ESP๋กœ 1๋ฒˆ๊ณก์„ ์ œ๋Œ€๋กœ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์„ธ์ค€์ด๋Š” EPIPHONE๊ณผ GIBSON์„ ์‚ฌ๋ฉด ์ตœ์†Œ์˜ ๊ฐœ์ˆ˜๋กœ ๋ชจ๋“  ๊ณก์„ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๊ธฐํƒ€์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ณก์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 10๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๊ณ , M์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ธฐํƒ€์˜ ์ด๋ฆ„๊ณผ ๊ธฐํƒ€๊ฐ€ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณก์˜ ์ •๋ณด๊ฐ€ 1๋ฒˆ ๊ณก๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. Y๋Š” ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๊ณ , N์€ ์—†๋Š” ๊ฒƒ์ด๋‹ค. ๊ธฐํƒ€์˜ ์ด๋ฆ„์€ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๊ธธ์ด๋Š” 2 ์ด์ƒ, 50 ์ดํ•˜์ด๋‹ค. ๋‘ ๊ธฐํƒ€์˜ ์ด๋ฆ„์ด ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ•„์š”ํ•œ ๊ธฐํƒ€์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณก์ด ์—†์œผ๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅˆ ๋ฌธ์ œ ๋ ˆ๋ฒจ : ์‹ค๋ฒ„ 1
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ์ˆ˜ํ•™, ๋ธŒ๋ฃจํŠธํฌ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์กฐํ•ฉ๋ก , ๋น„ํŠธ๋งˆ์Šคํ‚น, ๋ฐฑํŠธ๋ž˜ํ‚น
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ์ฝ๊ณ , ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณก์„ booleanํ˜• ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ฒดํฌํ•˜๋ฉด์„œ

N๊ฐœ์˜ ๊ธฐํƒ€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์กฐํ•ฉ์„ ๋ชจ๋‘ ๋งŒ๋“ค์–ด ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณก์„ ์ฒดํฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค ํ–ˆ๋‹ค.

 

์ž…๋ ฅ์„ ๋ฐ›๋˜ ๋„์ค‘ ๋น„ํŠธ๋งˆ์Šคํ‚น์ด ์ƒ๊ฐ๋‚ฌ๊ณ , ๊ณก์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ๋Œ€ 50๊ฐœ์ด๋ฏ€๋กœ Longํ˜• ๋น„ํŠธ๋งˆ์Šคํ‚น์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ณก์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฐ์ฃผ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ณก์€ 1, ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ณก์€ 0์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž

YYYNN : 11100

NNNYY : 00011
์œ„์˜ ์—ฐ์ฃผ ๊ฐ€๋Šฅํ•œ ๋ชฉ๋ก์— ๋Œ€ํ•ด 2๊ฐœ์˜ ๊ธฐํƒ€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, OR ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

YYYNN (11100) | NNNYY (00011) = YYYYY (11111)

์ฆ‰, ๋ชจ๋“  ๊ณก์„ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ธฐํƒ€์˜ ์—ฐ์ฃผ ๊ฐ€๋Šฅ ๋ชฉ๋ก์„ ๋น„ํŠธ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ ํ›„,

  • ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ธฐํƒ€๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
    • OR ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์—ฐ์ฃผ ๊ฐ€๋Šฅํ•œ ๊ณก์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
    • bit | guitarBit[depth]
  • ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค์ง€ ๊ธฐํƒ€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
    • ๋‹ค์Œ ๊ธฐํƒ€๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

๋กœ ๋‚˜๋ˆ„์–ด ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

 

์œ„์˜ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•  ๋•Œ,

๋ชจ๋“  ๊ธฐํƒ€๋ฅผ ํ™•์ธํ–ˆ๊ฑฐ๋‚˜, ๋ชจ๋“  ๊ณก์„ ์น  ์ˆ˜ ์žˆ์ง€๋งŒ ์ตœ์†Ÿ๊ฐ’์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋” ์ด์ƒ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•ด๋„ ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ข…๋ฃŒํ•œ๋‹ค.

 

๋˜ํ•œ, ๋ฌธ์ œ์—์„œ ์ค‘๋ณต๋˜๋Š” ๊ธฐํƒ€๋Š” ์—†๋‹ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ

๊ธฐํƒ€์˜ ์ด๋ฆ„์€ ๋”ฐ๋กœ ์ €์žฅํ•˜์ง€ ์•Š์•˜๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

 ๋ฉ”๋ชจ๋ฆฌ : 11600KB
 ์‹œ๊ฐ„ : 68ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int n, m;
    static long[] guitarBit; // ๊ฐ ๊ธฐํƒ€๊ฐ€ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณก์˜ ์ •๋ณด๋ฅผ ๋น„ํŠธ๋งˆ์Šคํ‚น์œผ๋กœ ํ‘œํ˜„
    static int max = 0; // ์—ฐ์ฃผ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๊ณก ๊ฐœ์ˆ˜
    static int ans = 987654321; // ํ•„์š”ํ•œ ๊ธฐํƒ€์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜
    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()); // ๊ณก ๊ฐœ์ˆ˜

        guitarBit = new long[n];

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            st.nextToken(); // ๊ธฐํƒ€ ์ด๋ฆ„
            char[] guitarArr = st.nextToken().toCharArray();
            for (int j = 0; j < m; j++) {
                if (guitarArr[j] == 'Y') { // ์—ฐ์ฃผ ๊ฐ€๋Šฅ 1, ๋ถˆ๊ฐ€๋Šฅ 0
                    guitarBit[i] |= (1L << j);
                }
            }
        }

        // ํ™•์ธํ•œ ๊ธฐํƒ€ ๊ฐœ์ˆ˜, ํ˜„์žฌ ์—ฐ์ฃผ ๊ฐ€๋Šฅํ•œ ๊ณก ๊ฐœ์ˆ˜, ์‚ฌ์šฉํ•œ ๊ธฐํƒ€ ๊ฐœ์ˆ˜
        back(0, 0L, 0);

        StringBuilder sb = new StringBuilder();
        if (ans == 0) { // ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณก X
            sb.append(-1).append("\n");
        } else sb.append(ans).append("\n");

        System.out.println(sb.toString());
    }

    private static void back(int depth, long bit, int usingGuitar) {
        int bitCnt = Long.bitCount(bit); // ํ˜„์žฌ ์—ฐ์ฃผ ๊ฐ€๋Šฅํ•œ ๊ณก ๊ฐœ์ˆ˜
		
        // ํ˜„์žฌ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณก์€ ๊ฐ™์ง€๋งŒ ์‚ฌ์šฉํ•œ ๊ธฐํƒ€ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ
        if (bitCnt == max && usingGuitar < ans) {
            // ์ตœ์†Œ ๊ธฐํƒ€ ๊ฐœ์ˆ˜ ๊ฐฑ์‹ 
            ans = usingGuitar;
        }
		
        // ์ตœ๋Œ€ ๊ณก ๊ฐœ์ˆ˜ ๋ณด๋‹ค ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณก์ด ๋” ๋งŽ์„ ๋•Œ
        if (max < bitCnt) {
            // ์‚ฌ์šฉํ•œ ๊ธฐํƒ€ ๊ฐœ์ˆ˜, ์—ฐ์ฃผ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๊ณก ๊ฐœ์ˆ˜ ๊ฐฑ์‹ 
            ans = usingGuitar;
            max = bitCnt;
        }

        // ๋ชจ๋“  ๊ณก์„ ์น  ์ˆ˜ ์žˆ์ง€๋งŒ ์ตœ์†Ÿ๊ฐ’์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ๋ชจ๋“  ๊ธฐํƒ€๋ฅผ ํ™•์ธํ•œ ๊ฒฝ์šฐ
        if (bitCnt == m || depth == n) {
            return;
        }

        // ํ˜„์žฌ ๊ธฐํƒ€ ์‚ฌ์šฉ
        back(depth+1, bit | guitarBit[depth], usingGuitar+1);
        // ์‚ฌ์šฉ X
        back(depth+1, bit, usingGuitar);
    }
}

 

ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๊ฝค ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ ๋ฌธ์ œ์˜€์ง€๋งŒ,

์˜ค๋žœ๋งŒ์— ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ๋น„ํŠธ๋งˆ์Šคํ‚น๊นŒ์ง€ ๋‹ค์‹œ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค ! ๐Ÿ”ฅ

๋ถ๋งˆํฌ ํ•ด๋’€๋‹ค ๋‹ค์‹œ ํ’€์–ด๋ด์•ผ์ง€ ๐Ÿ˜œ