Algorithm/์™„์ „ํƒ์ƒ‰(Brute-Force)

[๋ฐฑ์ค€, Java] 1062๋ฒˆ : ๊ฐ€๋ฅด์นจ

Zayson 2022. 5. 10. 22:59

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

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

๐Ÿ˜ฎ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋ฌธ์ œ์—์„œ ๋‚จ๊ทน ๋‹จ์–ด์˜ ์‹œ์ž‘๊ณผ ๋์€ anta, tica๋กœ ๋๋‚œ๋‹ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— a,n,t,i,c๋Š” ๋ฐ˜๋“œ์‹œ ๋ฐฐ์›Œ์•ผ ํ•˜๋Š” ๊ธ€์ž์ด๋‹ค.

a,n,t,i,c๋ฅผ ํฌํ•จํ•ด ๋‚จ์€ ์•ŒํŒŒ๋ฒณ ์ค‘ k๊ฐœ๋ฅผ ์กฐํ•ฉํ•œ๋‹ค.

์กฐํ•ฉํ•œ ์•ŒํŒŒ๋ฒณ์„ ๋‚จ๊ทน ๋‹จ์–ด๋งˆ๋‹ค ํ•ด๋‹น ์•ŒํŒŒ๋ฒณ์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š”์ง€ ํŒ๋‹จํ•˜๋ฉด์„œ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด๋ฅผ ์ฒดํฌํ•œ ํ›„ ํ˜„์žฌ ๊นŒ์ง€ ์ตœ๋Œ€๋กœ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด ๊ฐœ์ˆ˜์™€ ํ˜„์žฌ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด ๊ฐœ์ˆ˜๋ฅผ ๋น„๊ตํ•ด์„œ ๊ฐฑ์‹ ํ•œ๋‹ค.

  1. a,n,t,i,c๋Š” ๋ฐ˜๋“œ์‹œ ๋ฐฐ์›Œ์•ผ ํ•˜๋Š” ๊ธ€์ž์ด๋ฏ€๋กœ K๊ฐ€ 5๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๋‚จ๊ทน ๋‹จ์–ด๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— 0์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  2. K๊ฐ€ 5๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์ด๋ฏธ 5๊ฐœ๋ฅผ ๋ฐฐ์› ๊ธฐ ๋•Œ๋ฌธ์— a,n,t,i,c๋ฅผ ์ œ์™ธํ•œ (K - 5)๊ฐœ์˜ ๊ธ€์ž๋ฅผ ๋ฐฑํŠธ๋ž˜ํ‚น๊ณผ ์กฐํ•ฉ์„ ์ด์šฉํ•ด ์ถ”๊ฐ€๋กœ ์ฒดํฌํ•œ๋‹ค.
    1. teachingAlphabet์ด true ๋ผ๋ฉด ์•ŒํŒŒ๋ฒณ์„ ๋ฐฐ์šด ์ƒํƒœ์ด๋‹ค.
  3. ์•ŒํŒŒ๋ฒณ์„ ๋ชจ๋‘ ๋ฐฐ์› ๋‹ค๋ฉด, ๋‚จ๊ทน ๋‹จ์–ด์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํŒ๋‹จํ•œ๋‹ค.
  4. ํ˜„์žฌ ์•ŒํŒŒ๋ฒณ ์กฐํ•ฉ์—์„œ ๋ช‡๊ฐœ์˜ ๋‚จ๊ทน๋‹จ์–ด๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š”์ง€ ์ฒดํฌํ•œ ํ›„ ์ง€๊ธˆ๊นŒ์ง€ ์ตœ๋Œ€๋กœ ๋ฐฐ์šด ๋‹จ์–ด๊ฐœ์ˆ˜์™€ ๋น„๊ตํ•ด ์ตœ๋Œ€๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

๐Ÿšฉ Java ์ฝ”๋“œ

package com.algorithm.Baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_1062_๊ฐ€๋ฅด์นจ {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

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

        String[] words = new String[N];
        for (int loop = 0; loop < N; loop++) {
            words[loop] = br.readLine();
        }

        int rst = teachAnticWord(K, words);
        System.out.println(rst);

        br.close();
    }

    private static int count;
    private static int teachAnticWord(int K, String[] words) {
        /**
         * 1. a,n,t,i,c๋Š” ๋ฌด์กฐ๊ฑด ๋ฐฐ์›Œ์•ผํ•˜๋Š” ๊ธ€์ž์ด๋ฏ€๋กœ K๊ฐœ๊ฐ€ 5๊ฐœ ์ด์ƒ์ด๋ฉด 5๊ฐœ ๋นผ๊ณ  ๋‚จ์€ ๊ธ€์ž๋กœ ์กฐํ•ฉ ๋งŒ๋“ค๊ธฐ
         * 2. ๋งŒ๋“ค์–ด์ง„ ๊ธ€์ž ์กฐํ•ฉ์œผ๋กœ ๋ชจ๋“  ๋‹จ์–ด์— ํฌํ•จ๋˜๋Š” ๊ธ€์ž์ธ์ง€ ํƒ์ƒ‰ -> ํ•˜๋‚˜๋ผ๋„ ํฌํ•จ์ด ์•ˆ๋œ ๊ฒฝ์šฐ ๋‹ค์Œ ๋‹จ์–ด๋กœ
         * 3. ๊ธ€์ž ์กฐํ•ฉ ๋ณ„ ์ตœ๊ณ ๋กœ ๊ฐ€๋ฅด์น  ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด ๊ฐœ์ˆ˜ ๊ฐฑ์‹ 
         */
        // a,n,t,i,c๋ฅผ ๋ชป๋ฐฐ์šฐ๋Š” ๊ฒฝ์šฐ 0๊ฐœ
        if(K < 5) return 0;

        count = 0;
        boolean[] teachingAlphabet = new boolean[26];       // ๊ฐ€๋ฅด์น  ์•ŒํŒŒ๋ฒณ ์ฒดํฌ ๋ฐฐ์—ด
        // a,n,t,i,c๋Š” ๋ฌด์กฐ๊ฑด ๋ฐฐ์›Œ์•ผํ•˜๋ฏ€๋กœ true
        teachingAlphabet[0] = teachingAlphabet[2] = teachingAlphabet[8] = teachingAlphabet[13] = teachingAlphabet[19] = true;

        teachLetter(0,0, K - 5, words, teachingAlphabet);

        return count;
    }

    // start : ์‹œ์ž‘ ์ธ๋ฑ์Šค, letterCount : ๋ฐฐ์šด ๊ธ€์ž ๊ฐœ์ˆ˜, finishCount :  ๋ฐฐ์šธ ๊ธ€์ž ๊ฐœ์ˆ˜(a,n,t,i,c ์ œ์™ธ)
    private static void teachLetter(int start, int letterCount, int finishCount, String[] words, boolean[] teachingAlphabet) {
        if(letterCount == finishCount) {
            // 2. ๋งŒ๋“ค์–ด์ง„ ๊ธ€์ž ์กฐํ•ฉ์œผ๋กœ ๋ชจ๋“  ๋‹จ์–ด์— ํฌํ•จ๋˜๋Š” ๊ธ€์ž์ธ์ง€ ํƒ์ƒ‰ -> ํ•˜๋‚˜๋ผ๋„ ํฌํ•จ์ด ์•ˆ๋œ ๊ฒฝ์šฐ ๋‹ค์Œ ๋‹จ์–ด๋กœ
            int teachingCount = 0;
            for (String word : words) {
                boolean teach = true;
                for (char letter : word.toCharArray()) {
                    if(!teachingAlphabet[letter-97]) {   // ์•„์Šคํ‚ค์ฝ”๋“œ 97 : a
                        teach = false;
                        break;
                    }
                }
                if(teach) teachingCount++;
            }

            // 3. ๊ธ€์ž ์กฐํ•ฉ ๋ณ„ ์ตœ๊ณ ๋กœ ๊ฐ€๋ฅด์น  ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด ๊ฐœ์ˆ˜ ๊ฐฑ์‹ 
            count = Math.max(count, teachingCount);
            return;
        }

        // ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ ์กฐํ•ฉ ๋งŒ๋“ค๊ธฐ
        for(int alpha = start; alpha < 26; alpha++) {
            if(!teachingAlphabet[alpha]) {
                teachingAlphabet[alpha] = true;
                teachLetter(alpha +1, letterCount+1, finishCount, words, teachingAlphabet);
                teachingAlphabet[alpha] = false;
            }
        }
    }
}
๋ฐ˜์‘ํ˜•