๊ธฐ๋ก๋ฐฉ

BOJ_1062 : ๊ฐ€๋ฅด์นจ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_1062 : ๊ฐ€๋ฅด์นจ

Soom_1n 2024. 5. 20. 23:24

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • K๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ๋ฐฐ์› ์„ ๋•Œ, N๊ฐœ์˜ ๋‹จ์–ด(๋ฌธ์ž์—ด) ์ค‘ ์ตœ๋Œ€ ๋ช‡ ๊ฐœ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค.
  • ๋ชจ๋“  ๋‹จ์–ด๋Š” anta๋กœ ์‹œ์ž‘ํ•ด tica๋กœ ๋๋‚œ๋‹ค.

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

  • ๋‹จ์–ด์˜ ์‹œ์ž‘๊ณผ ๋์ด ์ •ํ•ด์ ธ ์žˆ์œผ๋ฏ€๋กœ, 'a', 'n', 't', 'i', 'c' ๋‹ค์„ฏ ๊ธ€์ž๋Š” ๋ฐ˜๋“œ์‹œ ์ฝ์„ ์ค„ ์•Œ์•„์•ผ ํ•œ๋‹ค.
    • K๊ฐ€ 5 ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ์—๋Š” 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • K >= 5 ์ผ ๋•Œ, K-5 ๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€๋กœ ๋ฐฐ์›Œ์„œ ๋ช‡ ๊ฐœ์˜ ๋‹จ์–ด๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
    • ๋น„ํŠธ ๋งˆ์Šคํ‚น์œผ๋กœ ๋ฐฐ์šด ๋ฌธ์ž๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.
    • ๋ฐฐ์šด ๋ฌธ์ž๋กœ ๋‹จ์–ด๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๋น„ํŠธ ๋งˆ์Šคํ‚น์œผ๋กœ ํ™•์ธํ•œ๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

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

public class Main {
    private static int N, K, MAX;
    private static int[] usedChar;

    public static void main(String[] args) throws IOException {
        // Intput
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());

        usedChar = new int[N];
        for (int i = 0; i < N; i++) {
            char[] chars = br.readLine().toCharArray();
            for (char c : chars) {
                usedChar[i] |= (1 << c - 'a'); // ์‚ฌ์šฉ ๋œ ๋ฌธ์ž ๋น„ํŠธ๋งˆ์Šคํ‚น : 1
            }
        }

        // a, c, i, n, t ๋Š” ๋ฐ˜๋“œ์‹œ ์ฝ์„ ์ค„ ์•Œ์•„์•ผ ํ•จ
        if (K < 5) {
            bw.write("0");
            bw.flush();
            return;
        }

        int mustLearned = (1 << ('a' - 'a')) | (1 << ('c' - 'a')) | (1 << ('i' - 'a')) | (1 << ('n' - 'a')) | (1 << ('t' - 'a'));


        // Combination : K๊ฐœ์˜ ๋ฌธ์ž ์„ ํƒ ํ›„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด ์ˆ˜ ์ฒดํฌ
        MAX = 0;
        combination(0, mustLearned, 5);

        // Output
        bw.write(Integer.toString(MAX));
        bw.flush();
    }

    private static void combination(int start, int learned, int cnt) {
        if (cnt == K) { // K๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ๊ณจ๋ž์œผ๋ฉด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด ์ˆ˜ ํ™•์ธ
            MAX = Math.max(MAX, read(learned));
            return;
        }
        for (int i = start; i < 26; i++) { // ๋น„ํŠธ ๋งˆ์Šคํ‚น ํ•˜๋‚˜์”ฉ 1 ๋งŒ๋“ค์–ด๋ณด๊ธฐ

            if ((learned & (1 << i)) == 0) { // ์•ˆ๋ฐฐ์šด ๋ฌธ์ž ๋ฐฐ์šฐ๊ธฐ
                combination(i + 1, learned | (1 << i), cnt + 1);
            }
        }
    }

    private static int read(int learned) { // ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด ์ˆ˜ ์„ธ๊ธฐ
        int cnt = 0;
        for (int i = 0; i < N; i++) {
            if ((usedChar[i] & learned) == usedChar[i])
                cnt++;
        }
        return cnt;
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • ์ฝ์„ ๋‹จ์–ด๋“ค์— ์‚ฌ์šฉ๋œ ๋ฌธ์ž๋ฅผ usedChar ๋ฐฐ์—ด์— ๋น„ํŠธ ๋งˆ์Šคํ‚นํ•œ๋‹ค.
  • K๊ฐ€ 5 ๋ฏธ๋งŒ์ด๋ฉด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด๊ฐ€ ์—†์œผ๋ฏ€๋กœ 0์„ ์ถœ๋ ฅํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•œ๋‹ค.
  • ๋ฐ˜๋“œ์‹œ ์ฝ์„ ์ค„ ์•Œ์•„์•ผ ํ•˜๋Š” 5๊ฐœ์˜ ๋‹จ์–ด๋ฅผ mustLearned์— ๋น„ํŠธ ๋งˆ์Šคํ‚นํ•œ๋‹ค.
  • ์žฌ๊ท€ ๋ฉ”์„œ๋“œ combination์œผ๋กœ ์กฐํ•ฉ ํ˜•์‹์„ ํ†ตํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐฐ์šธ ๋ฌธ์ž๋ฅผ ํ•˜๋‚˜์”ฉ ์„ ํƒํ•ด๋ณด๊ณ , ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด์˜ ์ตœ๋Œ€๊ฐ’ MAX๋ฅผ ๊ตฌํ•œ๋‹ค.
    • K๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ๋ชจ๋‘ ๋ฐฐ์› ์œผ๋ฉด read ๋ฉ”์„œ๋“œ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด์˜ ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.
    • ๋ฐฐ์šธ ๋ฌธ์ž๋ฅผ ์„ ํƒํ•  ๋•Œ start๋กœ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ , ๋น„ํŠธ๊ฐ€ 0์ธ์ง€ ํ™•์ธํ•ด์„œ ํ˜„์žฌ ๋ฐฐ์šฐ์ง€ ์•Š์€ ๋ฌธ์ž๋ฉด ๋ฐฐ์›Œ๋ณธ๋‹ค.
  • MAX๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  •  ์ฒ˜์Œ์—” ์‹œ๊ฐ„์ด 1์ดˆ๋กœ ์งง๊ธธ๋ž˜ Greedy๋กœ ํ’€์ดํ•ด์•ผํ•˜๋Š” ์ค„ ์•Œ๊ณ , ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ ๋ฌธ์ž ์ˆœ์œผ๋กœ ๋ฐฐ์šฐ๊ณ ์ž ํ–ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ๋ฐ˜๋ก€๊ฐ€ ์žˆ์—ˆ๊ณ , ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์‚ดํŽด๋ด์•ผํ•˜๋Š” Brute Force ๋ฌธ์ œ์—ฌ์„œ ํ‹€๋ ธ๋‹ค.
    • ํƒœ๊ทธ์— ๋น„ํŠธ ๋งˆ์Šคํ‚น์ด ์žˆ์–ด์„œ, ์กฐํ•ฉ์œผ๋กœ ํ’€์ดํ•ด๋ณด๊ณ ์ž ํ–ˆ์ง€๋งŒ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค. ์•Œ๊ณ ๋ณด๋‹ˆ ๋ฌธ์ œ์— ๋‹จ์–ด ์•ž๋’ค ๋ฌธ์ž๋Š” ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฑธ ๋ชป๋ดค์—ˆ๋‹ค...
  • ์˜ค๋žœ๋งŒ์— ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•ด์„œ ๋งŽ์ด ๋ฏธ์ˆ™ํ•œ ์ ์ด ์žˆ์—ˆ๋‹ค.
    • combination ๋ฉ”์„œ๋“œ์˜ ํ˜•ํƒœ๋Š” ์•„์ฃผ ๊ณ ์ •์ ์œผ๋กœ start์™€ ํ˜„์žฌ๊ฐ’, cnt ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”๋ฐ ํ˜•ํƒœ๋ฅผ ๋– ์˜ฌ๋ฆฌ๋Š”๋ฐ ์˜ค๋ž˜๊ฑธ๋ ธ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
    • ๋˜ ๋น„ํŠธ๋งˆ์Šคํ‚น์„ ๋งŽ์ด ํ™œ์šฉํ•ด๋ณด์ง€ ์•Š์•„์„œ ํ™œ์šฉ์„ฑ์ด ์ข‹์ง€ ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค. cnt๋ฅผ ์ธ์ž๋กœ ์•ˆ๋„˜๊ธฐ๊ณ  Integer.bitCount()๋ฉ”์„œ๋“œ๋กœ learned๋ฅผ ํ™•์ธํ•ด ๋ณด๋Š” ๋ฐฉ๋ฒ•๋„ ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™๋‹ค.
  • ๋“œ๋””์–ด solved.ac ํ”„๋กœํ•„ ์˜ ํ’€์ดํ•œ 100๋ฌธ์ œ ๋ชจ๋‘ ๊ณจ๋“œ4 ์ด์ƒ์œผ๋กœ ๋งž์ท„๋‹ค.
    • ์•ž์œผ๋กœ๋Š” ๊ณจ๋“œ3 ์ด์ƒ์˜ ๋ฌธ์ œ๋ฅผ ์ŠคํŠธ๋ฆญ์œผ๋กœ ํ’€์–ด์•ผํ•œ๋‹ค.
    • ์•„์ง ๋ฏธ์ˆ™ํ•œ ๋ถ€๋ถ„์ด ๋งŽ์ง€๋งŒ ์—ด์‹ฌํžˆ ํ•ด๋ณด์ž!
728x90