[BOJ] 1102. ๋ฐœ์ „์†Œ (๐Ÿ’Ž, ๋น„ํŠธ๋งˆ์Šคํ‚น)

lemythe423ยท2024๋…„ 3์›” 4์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
123/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

๋ฐœ์ „์†Œ๋Š” ์ตœ๋Œ€ 16๊ฐœ์ด๊ณ  ๋ชจ๋“  ๋ฐœ์ „์†Œ๋Š” ์ผœ์ ธ ์žˆ๊ฑฐ๋‚˜/๊บผ์ ธ ์žˆ๋Š” , ๋‘ ๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ์ผœ์ง„ ์ƒํƒœ๋ฅผ 1์ด๋ผ๊ณ  ํ•˜๊ณ  ๊บผ์ ธ ์žˆ๋Š” ์ƒํƒœ๋ฅผ 0์ด๋ผ๊ณ  ํ•˜์ž.

์ผœ์ง„ ๋ฐœ์ „์†Œ๋กœ๋งŒ ๊บผ์ ธ ์žˆ๋Š” ๋ฐœ์ „์†Œ๋ฅผ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์šฐ์„  ์ž‘๋™์‹œํ‚ฌ ๊บผ์ง„ ๋ฐœ์ „์†Œ๋ฅผ ์ฐพ์€ ํ›„ ํ•ด๋‹น ๋ฐœ์ „์†Œ๋ฅผ ์–ด๋–ค ์ผœ์ ธ ์žˆ๋Š” ๋ฐœ์ „์†Œ๋กœ ํ‚ฌ ๊ฑด์ง€๋ฅผ ์ฐพ๊ฒŒ ๋œ๋‹ค.

๋จผ์ € ๊บผ์ง„ ๋ฐœ์ „์†Œ๋ฅผ ์ฐพ์€ ํ›„, ํ•ด๋‹น ๋ฐœ์ „์†Œ๋ฅผ ํ‚ค๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ์˜ ๋น„์šฉ์ด ํ•„์š”ํ•œ ์ผœ์ง„ ๋ฐœ์ „์†Œ๋ฅผ ์ฐพ์•„ ๊บผ์ง„ ๋ฐœ์ „์†Œ๋ฅผ ํ‚ค๋ฉด ๋œ๋‹ค. ์ด๋•Œ ๊บผ์ง„ ๋ฐœ์ „์†Œ๋ฅผ ์ผœ์„œ ์™„์„ฑ๋˜๋Š” ๋ฐœ์ „์†Œ์˜ ์ž‘๋™ ์ƒํƒœ๋ฅผ ๋ณด๊ณ  ํ•ด๋‹น ์ž‘๋™ ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ๋“œ๋Š” ๋น„์šฉ์ด ๊ธฐ์กด์— ๋“ค๋˜ ๋น„์šฉ๋ณด๋‹ค ์ ์€ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น ๋ฐฉ์‹์œผ๋กœ ๊บผ์ง„ ๋ฐœ์ „์†Œ๋ฅผ ์ž‘๋™์‹œํ‚จ๋‹ค.

์ด๋•Œ dfs + dp๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ๋™์ž‘ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋น„ํŠธ ํƒ์ƒ‰์ด๊ธฐ ๋•Œ๋ฌธ์— ํƒ์ƒ‰์€ ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ๋จผ์ € 101001(41)์ด๋ผ๋Š” ์ˆซ์ž๊ฐ€ ์žˆ์„ ๋•Œ ๊บผ์ง„ ๋ฐœ์ „์†Œ ์ค‘ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œ ๋œ ๋‘ ๊ฐœ์˜ ๋ฐœ์ „์†Œ๋ฅผ ํ‚จ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์˜ค๋ฅธ์ชฝ์— ์ข€ ๋” ๊ฐ€๊นŒ์šด ๋ฐœ์ „์†Œ๋ฅผ ๋จผ์ € ํƒ์ƒ‰ํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฒˆํ˜ธ ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค. ์˜ค๋ฅธ์ชฝ์—์„œ 3๋ฒˆ์งธ์— ์žˆ๋Š” ๋ฐœ์ „์†Œ๋ฅผ ํ‚จ ๋‹ค์Œ, ์™ผ์ชฝ์—์„œ ๋‘ ๋ฒˆ์งธ ์žˆ๋Š” ๋ฐœ์ „์†Œ๋ฅผ ํ‚ค๋Š” ๊ณผ์ •๊นŒ์ง€๊ฐ€ 1, 2๋ฒˆ ๊ณผ์ •์ด๋‹ค. ๋งˆ์ง€๋ง‰ ๋‚จ์€ ํ•˜๋‚˜์˜ ๋ฐœ์ „์†Œ๋ฅผ ํ‚ค๋ฉด 3๋ฒˆ์ด ๋˜๊ณ  ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๊ฒŒ ๋œ๋‹ค(์—ฌ๊ธฐ์„œ๋Š” P=6์ด๋ผ๊ณ  ๊ฐ€์ •). ๋น„ํŠธ 111111์€ ์กฐ๊ฑด (cnt >= P)์„ ๋งŒ์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— return 0์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๊ณ  dp[111111] ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

dp[111111] = Math.min(dp[111111], 0 + power[j][i])

dp์˜ ๋ชจ๋“  ์ดˆ๊ธฐ๊ฐ’์€ INF์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ๋„ dp[111111] = power[j][i]๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

์žฌ๊ท€ ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ๋ก€๋Œ€๋กœ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด์„œ ์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋˜๊ณ  dp[111101]๊ณผ dp[101101]์—๋„ ๊ฐ’์ด ์ฑ„์›Œ์ง€๊ฒŒ ๋œ๋‹ค.

์ด์ œ ๋‹ค์‹œ ์ฒ˜์Œ ์ƒํƒœ๋กœ ๋˜๋Œ์•„์™€์„œ ์ด๋ฒˆ์—๋Š” ์™ผ์ชฝ ๋‘๋ฒˆ์งธ ๋ฐœ์ „์†Œ๋ฅผ ๋จผ์ € ํ‚ค๋Š” ๋ฐฉ์‹์„ ํƒํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์™ผ์ชฝ ๋‘๋ฒˆ์งธ๋ฅผ ํ‚จ ํ›„, ์˜ค๋ฅธ์ชฝ ์„ธ๋ฒˆ์งธ ๋ฐœ์ „์†Œ๋ฅผ ํ‚ค๊ฒŒ ๋˜๋ฉด ์•„๊นŒ ์ด๋ฏธ ํƒ์ƒ‰ํ–ˆ๋˜ dp[111101]์„ ๋‹ค์‹œ ์ง€๋‚˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฏธ dp[111101]์€ ์ดˆ๊ธฐํ™” ๊ฐ’์ธ INF๊ฐ€ ์•„๋‹Œ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์˜ค๋ฅธ์ชฝ์—์„œ ์„ธ๋ฒˆ์งธ ๋ฐœ์ „์†Œ๋ฅผ ๋จผ์ € ํ‚ค๋Š” ๊ณผ์ •์—์„œ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ณณ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ๋‘ ๋ฒˆ ๋ฐฉ๋ฌธํ•  ํ•„์š”๋Š” ์—†๋Š” ๊ฒƒ์ด๋‹ค. ํ˜„์žฌ๊นŒ์ง€ ์˜ค๋Š” ๊ณผ์ •์ด ์–ด๋–ป๋“ ๊ฐ€์™€ ์ƒ๊ด€์—†์ด ์•ž์œผ๋กœ 111101์—์„œ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋  ๊ฒฝ๋กœ๋Š” ์ด์ „์— ๋ฏธ๋ฆฌ ์ง€๋‚˜์˜จ ๊ฒฝ๋กœ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๊ณผ์ •์—์„œ dp๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

dp[cur]์— ์ €์žฅ๋œ ๊ฐ’์ด ์ดˆ๊ธฐํ™”๋œ ๊ฐ’์ด ์•„๋‹ˆ๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ณณ์ด๋ฏ€๋กœ ํ•ด๋‹น ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๊ณ  return

์ด๋•Œ dp๋ฐฐ์—ด์€ ๊ตณ์ด 2์ฐจ์›์ผ ํ•„์š”๊ฐ€ ์—†๋Š”๋ฐ ๊ฐ ๋น„ํŠธ๊ฐ’์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ผœ์•ผ ํ•˜๋Š” ๋ฐœ์ „์†Œ์˜ ๊ฐœ์ˆ˜๋Š” ์ด๋ฏธ ๋‹ค ์ •ํ•ด์ ธ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 101010์„ ์ดˆ๊ธฐ๊ฐ’์ด๋ผ๊ณ  ํ–ˆ์„๋•Œ 111110์€ ๋ฌด์กฐ๊ฑด 2๊ฐœ๋ฅผ ์ผœ์•ผ ํ•˜๊ณ , 111010์€ ๋ฌด์กฐ๊ฑด ํ•œ๊ฐœ๋ฅผ ์ผœ์•ผ ํ•œ๋‹ค.

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

public class Main {
    static int N;
    static int P;
    static int[][] power;
    static int[] dp;
    static final int INF = Integer.MAX_VALUE;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        power = new int[N][N];
        StringTokenizer st;
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                power[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        String powerState = br.readLine();
        P = Integer.parseInt(br.readLine());

        int curVar = 0;
        int initCnt = 0;
        for (int i = 0; i < N; i++) {
            if (powerState.charAt(i) == 'Y') {
                curVar |= (1 << i);
                initCnt++;
            }
        }

        dp = new int[1<<N];
        Arrays.fill(dp, INF);
        if (initCnt >= P) dp[curVar] = 0;
        dfs(curVar, initCnt);
        System.out.println(dp[curVar] == INF ? -1 : dp[curVar]);
        // System.out.println(Arrays.toString(dp));
    }

    static int dfs(int cur, int cnt) {
        if (cnt >= P) return 0;
        if (dp[cur] != INF) return dp[cur];
        
        for (int i = 0; i < N; i++) {
            if ((cur & (1 << i)) != 0) continue; // ์ด๋ฏธ ์ผœ์ง„ ๋ฐœ์ „์†Œ๋ผ๋ฉด ์ง€๋‚˜๊ฐ

            for (int j = 0; j < N; j++) {
                if ((cur & (1 << j)) == 0) continue; // ๊บผ์ง„ ๋ฐœ์ „์†Œ๋กœ๋Š” ๋‹ค๋ฅธ ๊บผ์ง„ ๋ฐœ์ „์†Œ๋ฅผ ํ‚ฌ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ง€๋‚˜๊ฐ
                
                dp[cur] = Math.min(dp[cur], dfs(cur | (1 << i), cnt + 1) + power[j][i]);
            }
        }
        return dp[cur];
    }
}
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€