๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[Java] BOJ 16508 ์ „๊ณต์ฑ…

by ๐ŸŠ๊ทค๐ŸŠ 2024. 12. 11.

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/11723

  • ๋ฏผํ˜ธ๋Š” ์ „๊ณต์ฑ… ์ œ๋ชฉ์— ์žˆ๋Š” ๊ธ€์ž๋“ค์„ ์˜ค๋ ค์„œ ๋‹จ์–ด ๋งŒ๋“ค๊ธฐ ๋†€์ด๋ฅผ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
  • ๋‹จ์–ด ๋งŒ๋“ค๊ธฐ ๋†€์ด๋Š” ์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™๋‹ค.
    • 1๋ฒˆ ์ฑ… : COMPUTERARCHITECTURE (35,000์›)
    • 2๋ฒˆ ์ฑ… : ALGORITHM (47,000์›)
    • 3๋ฒˆ ์ฑ… : NETWORK (43,000์›)
    • 4๋ฒˆ ์ฑ… : OPERATINGSYSTEM (40,000์›)
    • ๋งŒ์•ฝ ๋ฏผํ˜ธ๊ฐ€ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋‹จ์–ด๊ฐ€ ALMIGHTY๋ผ๊ณ  ํ•˜๋ฉด, ์œ„ 4๊ฐœ์˜ ์ฑ… ์ค‘, 1๋ฒˆ ์ฑ…์—์„œ A๋ฅผ, 2๋ฒˆ ์ฑ…์—์„œ L, M, I, G, H, T๋ฅผ, 4๋ฒˆ ์ฑ…์—์„œ Y๋ฅผ ์˜ค๋ ค๋‚ด์–ด ์›ํ•˜๋Š” ๋‹จ์–ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋•Œ ๋“œ๋Š” ๋น„์šฉ์€ 1๋ฒˆ, 2๋ฒˆ, 4๋ฒˆ ์ฑ… ๊ฐ€๊ฒฉ์˜ ํ•ฉ์ธ 122,000์›์ด๋‹ค.
    • ๋งŒ์•ฝ ANT๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜๋ฉด, 2๋ฒˆ ์ฑ…์—์„œ A๋ฅผ, 3๋ฒˆ ์ฑ…์—์„œ N, T๋ฅผ ์˜ค๋ ค๋‚ด์–ด ์›ํ•˜๋Š” ๋‹จ์–ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ๋“œ๋Š” ๋น„์šฉ์€ 2๋ฒˆ๊ณผ 3๋ฒˆ ์ฑ… ๊ฐ€๊ฒฉ์„ ํ•ฉํ•˜์—ฌ 90,000์›์ด๋‹ค.
    • ๊ทธ๋Ÿฐ๋ฐ, ANT๋ผ๋Š” ๋‹จ์–ด์—์„œ A๋ฅผ 2๋ฒˆ ์ฑ…์—์„œ ์˜ค๋ ค๋‚ด์ง€ ์•Š๊ณ , 4๋ฒˆ ์ฑ…์— ์žˆ๋Š” A๋ฅผ ์˜ค๋ ค๋‚ผ ์ˆ˜๋„ ์žˆ๋‹ค. ๋งŒ์•ฝ 4๋ฒˆ ์ฑ…์—์„œ A๋ฅผ ์˜ค๋ ค๋ƒˆ์„ ๋•Œ ๋“œ๋Š” ๋น„์šฉ์€ 3๋ฒˆ๊ณผ 4๋ฒˆ ์ฑ… ๊ฐ€๊ฒฉ์„ ํ•ฉํ•˜์—ฌ 83,000์›์œผ๋กœ 2๋ฒˆ๊ณผ 3๋ฒˆ ์ฑ…์„ ๊ณ ๋ฅธ ๋น„์šฉ๋ณด๋‹ค ์ž‘๋‹ค.
    • ํ•˜์ง€๋งŒ, 4๋ฒˆ ์ฑ…์—๋Š” ANT๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, 4๋ฒˆ ์ฑ…๋งŒ ์„ ํƒํ–ˆ์„ ๋•Œ ๋“œ๋Š” ๋น„์šฉ์ด 40,000์›์ด๋‹ค.
    • ์ด๋Š” ANT๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์ด๋‹ค.
  • ๋ฏผํ˜ธ๋Š” ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์œผ๋กœ ์ž์‹ ์ด ์›ํ•˜๋Š” ๋‹จ์–ด๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์–ด๋–ค ์ „๊ณต์ฑ…๋“ค์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ–ˆ๋‹ค. 
  • ๋ฏผํ˜ธ๋ฅผ ๋„์™€ ๊ฐ ์ „๊ณต์ฑ…์˜ ๊ฐ€๊ฒฉ๊ณผ ์ œ๋ชฉ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์œผ๋กœ ๋ฏผํ˜ธ๊ฐ€ ์›ํ•˜๋Š” ๋‹จ์–ด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ค ์ „๊ณต์ฑ…์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.
  • ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ฏผํ˜ธ๊ฐ€ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ๋‹จ์–ด๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋ฌธ์ž์—ด T (1 ≤ |T| ≤ 10)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. T๋Š” ํ•ญ์ƒ ๋Œ€๋ฌธ์ž์ด๋ฉฐ, |T|๋Š” ๋ฌธ์ž์—ด T์˜ ๊ธธ์ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ฏผํ˜ธ๊ฐ€ ๊ฐ€์ง„ ์ „๊ณต์ฑ…์˜ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋Š” ์ •์ˆ˜ N (1 ≤ N ≤ 16)์ด ์ฃผ์–ด์ง„๋‹ค.
  • ๋‹ค์Œ N๊ฐœ์˜ ๊ฐ ์ค„์—๋Š” ์ „๊ณต์ฑ… ๊ฐ€๊ฒฉ์„ ์˜๋ฏธํ•˜๋Š” ์ •์ˆ˜ Ci (10,000 ≤ Ci ≤ 100,000)์™€ ์ œ๋ชฉ์„ ์˜๋ฏธํ•˜๋Š” ๋ฌธ์ž์—ด Wi (1 ≤ |Wi| ≤ 50)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. Wi๋Š” ํ•ญ์ƒ ๋Œ€๋ฌธ์ž์ด๋‹ค.
  • ๋ฏผํ˜ธ๊ฐ€ ์›ํ•˜๋Š” ๋‹จ์–ด T๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ์ „๊ณต์ฑ…์˜ ๊ฐ€์žฅ ์ ์€ ๊ฐ€๊ฒฉ์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ๋‹จ์–ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

์•„์ด๋””์–ด

  • ์šฐ์„  ์ฑ… ๊ฐ€๊ฒฉ๊ณผ ์ œ๋ชฉ์„ ์ž…๋ ฅ๋ฐ›๊ณ  DFS๋ฅผ ํ†ตํ•ด ์ฑ…์˜ ์กฐํ•ฉ์„ ์งฐ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์ฑ… ์กฐํ•ฉ์˜ ์ œ๋ชฉ๋“ค์—์„œ HashMap์„ ํ™œ์šฉํ•˜์—ฌ ๊ธ€์ž์™€ ํ•ด๋‹น ๊ธ€์ž์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ฐพ์•„์•ผ๋˜๋Š” ๋ฌธ์ž์—ด์— ์žˆ๋Š” ๋ฌธ์ž์™€ ํ•ด๋‹น ๋ฌธ์ž์˜ ๊ฐฏ์ˆ˜๋ฅผ HashMap์— ์ €์žฅํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ฐพ์•„์•ผ๋˜๋Š” ๋ฌธ์ž๋ฅผ key๋กœ ๊ธฐ์ค€์œผ๋กœ ์ฑ… ์กฐํ•ฉ์˜ ์ œ๋ชฉ๋“ค์˜ ๊ธ€์ž์™€ ๊ธ€์ž์ˆ˜๋ฅผ ์ €์žฅํ•œ HashMap์—์„œ value ๊ฐ’์„ ์ฐพ๊ณ , ์ฐพ์•„์•ผ๋˜๋Š” ๋ฌธ์ž์—ด์˜ ๋ฌธ์ž์™€ ๊ฐฏ์ˆ˜๋ฅผ ์ €์žฅํ•œ HashMap์— ์ €์žฅ๋œ value๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ํ•ด๋‹น key๊ฐ’์ด ์—†์œผ๋ฉด ํ•ด๋‹น ์ฑ… ์กฐํ•ฉ์—์„œ ์ฐพ์•„์•ผ๋˜๋Š” ๋ฌธ์ž์—ด์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
  • ๋งŒ์•ฝ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋ฌธ์ž์—ด์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒฝ์šฐ, ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.  

๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

  • ๋ญ”๊ฐ€.. ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ์–ด๋ ต๊ฒŒ ํ‘ผ๊ฑฐ ๊ฐ™๋‹ค... ์ข€ ์‰ฝ๊ฒŒ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ... ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค..

์‰ฌ์šด๋ฌธ์ œ์˜€๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ ์–ด๋ ต๊ฒŒ ์˜ค๋ž˜ ํ‘ผ๊ฑฐ ๊ฐ™์•„์„œ ์Šฌํ”„๋‹ค..ใ…œใ…œ ๋” ์ •์ง„ํ•˜์ž..ใ…œใ…œใ…œ

์ฝ”๋“œ

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

public class BOJ16508 {

    static public int[] cost;
    static public boolean[] visited;
    static public String[] books;
    static public int N;
    static public String s;
    static public int result;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // ๋งŒ๋“ค ๊ธ€์ž
        s = br.readLine();

        // ์ฑ… ์ˆ˜
        N = Integer.parseInt(br.readLine());

        // ๊ฐ€๊ฒฉ ์ €์žฅํ•  ๋ฐฐ์—ด
        cost = new int[N];
        // ๊ฐ€๊ฒฉ์ด๋ž‘ ์ฑ… ์ด๋ฆ„์„ ์ €์žฅํ•  ๋ฐฐ์—ด
        books = new String[N];
        // ์ฑ… ์กฐํ•ฉ์„ ๋งŒ๋“ค ๋•Œ ์“ธ, ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
        visited = new boolean[N];

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            // ๊ฐ€๊ฒฉ
            cost[i] = Integer.parseInt(st.nextToken());
            // ์ฑ… ์ด๋ฆ„
            books[i] = st.nextToken();
        }

        // ๊ฒฐ๊ณผ๊ฐ’ ์ดˆ๊ธฐํ™”
        result = Integer.MAX_VALUE;

        // ์ฑ… ์กฐํ•ฉ์„ ํ†ตํ•ด ์ตœ์†Œ ๋น„์šฉ์„ ์ฐพ์Œ
        for (int i = 1; i <= N; i++) {
            int[] arr = new int[i];
            DFS(0, i, arr);
        }

        // ๊ฒฐ๊ณผ๊ฐ’์ด ๊ฐฑ์‹ ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด -1 ์ถœ๋ ฅ
        if (result == Integer.MAX_VALUE) {
            System.out.println(-1);
        } else {
            System.out.println(result);
        }
    }

    // DFS ํƒ์ƒ‰
    public static void DFS(int depth, int limit, int[] pri) {
        if (depth == limit) {
            // ์„ ํƒํ•œ ์ฑ… ์กฐํ•ฉ์˜ ๊ฐ€๊ฒฉ๊ณผ ๊ธ€์ž ๋งค์นญ ์ˆ˜ํ–‰
            checkWords(pri);
            return;
        }

        // ์ค‘๋ณต ์กฐํ•ฉ ๋ฐฉ์ง€ (ํ˜„์žฌ depth์˜ ์ด์ „ ์ธ๋ฑ์Šค๋ณด๋‹ค ํฐ ์ธ๋ฑ์Šค๋งŒ ํƒ์ƒ‰)
        for (int i = (depth == 0) ? 0 : pri[depth - 1] + 1; i < N; i++) {
            if (!visited[i]) {

                visited[i] = true;
                pri[depth] = i;

                DFS(depth + 1, limit, pri);

                visited[i] = false;
            }
        }
    }

    // ์„ ํƒํ•œ ์ฑ… ์กฐํ•ฉ์œผ๋กœ ์ตœ์†Œ ๋น„์šฉ ์ฐพ๊ธฐ
    public static void checkWords(int[] pri) {
        // ์ฐพ์•„์•ผ ํ•˜๋Š” ๋ฌธ์ž์™€ ๊ฐฏ์ˆ˜๋ฅผ ์ €์žฅํ•  HashMap
        HashMap<Character, Integer> targetCount = new HashMap<>();

        // ์ฐพ์•„์•ผํ•˜๋Š” ๋ฌธ์ž์—ด์—์„œ ๊ธ€์ž๋ฅผ ํ‚ค๋กœ ํ•˜์—ฌ ๊ทธ ๋ฌธ์ž์˜ ๊ฐฏ์ˆ˜๋งŒํผ value๊ฐ’์„ ๊ฐฑ์‹ 
        for (char c : s.toCharArray()) {
            targetCount.put(c, targetCount.getOrDefault(c, 0) + 1);
        }

        // ์กฐํ•ฉ๋œ ์ฑ…๋“ค์˜ ๋ฌธ์ž์™€ ๊ฐฏ์ˆ˜๋ฅผ ์ €์žฅํ•  HashMap
        HashMap<Character, Integer> currentCount = new HashMap<>();

        // ์ฑ…์˜ ์ด ๊ฐ€๊ฒฉ
        int totalPrice = 0;

        // ์กฐํ•ฉ๋œ ์ฑ… ๋ฐฐ์—ด์˜ ์ด ๊ฐ€๊ฒฉ์„ ๊ณ„์‚ฐํ•˜๊ณ 
        for (int i : pri) {
            totalPrice += cost[i];

            // ํ•ด๋‹น ์ œ๋ชฉ๋“ค์— ์žˆ๋Š” ๋ฌธ์ž๋ฅผ key๊ฐ’์œผ๋กœ ํ•˜์—ฌ ๊ทธ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ value๋กœ ์ €์žฅ
            for (char c : books[i].toCharArray()) {
                // ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ์ด๋ฏธ HashMap์— key๊ฐ’์œผ๋กœ ์žˆ์œผ๋ฉด ๊ธฐ์ค€ value๊ฐ’์— 1์„ ๋”ํ•œ ๊ฐ’์„
                // value๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๊ณ  ์—†๋‹ค๋ฉด 1์„ ์ €์žฅ
                currentCount.put(c, currentCount.getOrDefault(c, 0) + 1);
            }
        }

        // ๋ชฉํ‘œ ๊ธ€์ž๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ
        boolean canMake = true;

        for (char key : targetCount.keySet()) {
            // ๋งŒ์•ฝ ์ฐพ์•„์•ผ๋˜๋Š” ๋ฌธ์ž์˜ ๊ฐฏ์ˆ˜๊ฐ€
            // ์ฑ… ์ œ๋ชฉ์˜ ์กฐํ•ฉ์—์„œ ์ฐพ์€ ๋ฌธ์ž์˜ ๊ฐฏ์ˆ˜๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ํ•ด๋‹น ๋ฌธ์ž๋ฅผ
            // key ๊ฐ’์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋ฉด
            if (currentCount.getOrDefault(key, 0) < targetCount.get(key)) {
                // ๋ชฉํ‘œ ๊ธ€์ž๋ฅผ ๋ชจ๋‘ ๋ชป ์ฐพ์œผ๋ฏ€๋กœ false๋กœ ๋ณ€ํ™˜
                canMake = false;

                break;
            }
        }


        // ๋ชฉํ‘œ ๋ฌธ์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ฐ€๊ฒฉ ๊ฐฑ์‹ 
        if (canMake) {
            result = Math.min(result, totalPrice);
        }
    }
}