J

[JAVA] BOJ ๋ฐฑ์ค€ 14889 ์Šคํƒ€ํŠธ์™€ ๋งํฌ ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ’ป Samsung SW Expert

[JAVA] BOJ ๋ฐฑ์ค€ 14889 ์Šคํƒ€ํŠธ์™€ ๋งํฌ

snowball๐Ÿฐ 2023. 1. 29. 00:37

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

 

14889๋ฒˆ: ์Šคํƒ€ํŠธ์™€ ๋งํฌ

์˜ˆ์ œ 2์˜ ๊ฒฝ์šฐ์— (1, 3, 6), (2, 4, 5)๋กœ ํŒ€์„ ๋‚˜๋ˆ„๋ฉด ๋˜๊ณ , ์˜ˆ์ œ 3์˜ ๊ฒฝ์šฐ์—๋Š” (1, 2, 4, 5), (3, 6, 7, 8)๋กœ ํŒ€์„ ๋‚˜๋ˆ„๋ฉด ๋œ๋‹ค.

www.acmicpc.net

๋ฌธ์ œ

์˜ค๋Š˜์€ ์Šคํƒ€ํŠธ๋งํฌ์— ๋‹ค๋‹ˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ชจ์—ฌ์„œ ์ถ•๊ตฌ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์ถ•๊ตฌ๋Š” ํ‰์ผ ์˜คํ›„์— ํ•˜๊ณ  ์˜๋ฌด ์ฐธ์„๋„ ์•„๋‹ˆ๋‹ค. ์ถ•๊ตฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ์ธ ์‚ฌ๋žŒ์€ ์ด N๋ช…์ด๊ณ  ์‹ ๊ธฐํ•˜๊ฒŒ๋„ N์€ ์ง์ˆ˜์ด๋‹ค. ์ด์ œ N/2๋ช…์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์Šคํƒ€ํŠธ ํŒ€๊ณผ ๋งํฌ ํŒ€์œผ๋กœ ์‚ฌ๋žŒ๋“ค์„ ๋‚˜๋ˆ ์•ผ ํ•œ๋‹ค.

BOJ๋ฅผ ์šด์˜ํ•˜๋Š” ํšŒ์‚ฌ ๋‹ต๊ฒŒ ์‚ฌ๋žŒ์—๊ฒŒ ๋ฒˆํ˜ธ๋ฅผ 1๋ถ€ํ„ฐ N๊นŒ์ง€๋กœ ๋ฐฐ์ •ํ–ˆ๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ๋Šฅ๋ ฅ์น˜๋ฅผ ์กฐ์‚ฌํ–ˆ๋‹ค. ๋Šฅ๋ ฅ์น˜ Sij๋Š” i๋ฒˆ ์‚ฌ๋žŒ๊ณผ j๋ฒˆ ์‚ฌ๋žŒ์ด ๊ฐ™์€ ํŒ€์— ์†ํ–ˆ์„ ๋•Œ, ํŒ€์— ๋”ํ•ด์ง€๋Š” ๋Šฅ๋ ฅ์น˜์ด๋‹ค. ํŒ€์˜ ๋Šฅ๋ ฅ์น˜๋Š” ํŒ€์— ์†ํ•œ ๋ชจ๋“  ์Œ์˜ ๋Šฅ๋ ฅ์น˜ Sij์˜ ํ•ฉ์ด๋‹ค. Sij๋Š” Sji์™€ ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, i๋ฒˆ ์‚ฌ๋žŒ๊ณผ j๋ฒˆ ์‚ฌ๋žŒ์ด ๊ฐ™์€ ํŒ€์— ์†ํ–ˆ์„ ๋•Œ, ํŒ€์— ๋”ํ•ด์ง€๋Š” ๋Šฅ๋ ฅ์น˜๋Š” Sij์™€ Sji์ด๋‹ค.

N=4์ด๊ณ , S๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž.

i\j 1 2 3 4
1   1 2 3
2 4   5 6
3 7 1   2
4 3 4 5  

์˜ˆ๋ฅผ ๋“ค์–ด, 1, 2๋ฒˆ์ด ์Šคํƒ€ํŠธ ํŒ€, 3, 4๋ฒˆ์ด ๋งํฌ ํŒ€์— ์†ํ•œ ๊ฒฝ์šฐ์— ๋‘ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ์Šคํƒ€ํŠธ ํŒ€: S12 + S21 = 1 + 4 = 5
  • ๋งํฌ ํŒ€: S34 + S43 = 2 + 5 = 7

1, 3๋ฒˆ์ด ์Šคํƒ€ํŠธ ํŒ€, 2, 4๋ฒˆ์ด ๋งํฌ ํŒ€์— ์†ํ•˜๋ฉด, ๋‘ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ์Šคํƒ€ํŠธ ํŒ€: S13 + S31 = 2 + 7 = 9
  • ๋งํฌ ํŒ€: S24 + S42 = 6 + 4 = 10

์ถ•๊ตฌ๋ฅผ ์žฌ๋ฏธ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์Šคํƒ€ํŠธ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜์™€ ๋งํฌ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜์˜ ์ฐจ์ด๋ฅผ ์ตœ์†Œ๋กœ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์œ„์˜ ์˜ˆ์ œ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” 1, 4๋ฒˆ์ด ์Šคํƒ€ํŠธ ํŒ€, 2, 3๋ฒˆ ํŒ€์ด ๋งํฌ ํŒ€์— ์†ํ•˜๋ฉด ์Šคํƒ€ํŠธ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜๋Š” 6, ๋งํฌ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜๋Š” 6์ด ๋˜์–ด์„œ ์ฐจ์ด๊ฐ€ 0์ด ๋˜๊ณ  ์ด ๊ฐ’์ด ์ตœ์†Œ์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N(4 ≤ N ≤ 20, N์€ ์ง์ˆ˜)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— S๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ค„์€ N๊ฐœ์˜ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , i๋ฒˆ ์ค„์˜ j๋ฒˆ์งธ ์ˆ˜๋Š” Sij ์ด๋‹ค. Sii๋Š” ํ•ญ์ƒ 0์ด๊ณ , ๋‚˜๋จธ์ง€ Sij๋Š” 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์Šคํƒ€ํŠธ ํŒ€๊ณผ ๋งํฌ ํŒ€์˜ ๋Šฅ๋ ฅ์น˜์˜ ์ฐจ์ด์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

์ฝ”๋“œ

์ „์ฒด ์ฝ”๋“œ

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

public class BOJ_14889 {
    static int half;
    static int N;
    static int[] team;
    static int[][] power;
    static int result;

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

        StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
        N = Integer.parseInt(st.nextToken());
        power = new int[N][N]; // ๋Šฅ๋ ฅ์น˜๋ฅผ ๋‹ด์„ ๋ณ€์ˆ˜
        team = new int[N]; // 0, 1์˜ ๊ฐ’๋งŒ ๊ฐ–๊ณ  ๊ฐ™์€ ์ˆซ์ž๋ฅผ ๊ฐ€์ง„ i+1๋ฒˆ์€ ๊ฐ™์€ ํŒ€์ด๋‹ค.
        half = N / 2;
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(bf.readLine(), " ");
            for (int j = 0; j < N; j++)
                power[i][j] = Integer.parseInt(st.nextToken());
        }
        result = Integer.MAX_VALUE; // ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์ตœ๋Œ€๊ฐ’์„ ๊ฒฐ๊ณผ๊ฐ’์— ๋„ฃ์–ด์ค€๋‹ค.
        dfs(0, 0);
        sb.append(result);
        System.out.println(sb.toString());
    }

    static void dfs(int member, int x) {
        if (member == half) { // ๋ฉค๋ฒ„๊ฐ€ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์–ด์กŒ์œผ๋ฏ€๋กœ ๋Šฅ๋ ฅ์น˜๋ฅผ ๊ณ„์‚ฐํ•ด์ค€๋‹ค.
            int score1 = 0, score2 = 0; // ๊ฐ ํŒ€์˜ ์ ์ˆ˜๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜๋กœ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
            for (int k = 0; k < N; k++) {
                for (int u = k + 1; u < N; u++) { // u๋„ 0์—์„œ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ™์€ ์ ์ˆ˜๋ฅผ ๋‘๋ฒˆ ๋”ํ•˜๊ฒŒ ๋œ๋‹ค.
                    if (team[k] == 0 && team[u] == 0)
                        score2 += power[k][u] + power[u][k];
                    if (team[k] == 1 && team[u] == 1)
                        score1 += power[k][u] + power[u][k];
                }
            }
            if (Math.abs(score1 - score2) < result) // ์ ˆ๋Œ“๊ฐ’๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋” ์ž‘์€ ๊ฒฝ์šฐ ๊ฐฑ์‹ ํ•œ๋‹ค.
                result = Math.abs(score1 - score2);
            return;
        }

        for (int i = x + 1; i < N; i++) { // ์›๋ž˜๋Š” x์—์„œ ์‹œ์ž‘ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ๋ถ„ํ• ๋ฌธ์ œ์ด๋ฏ€๋กœ ํŒ€์˜ ์ˆซ์ž๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์•„ +1์—์„œ ์‹œ์ž‘ํ•ด๋„ ๋œ๋‹ค.
            team[i] = 1;
            dfs(member + 1, i);
            team[i] = 0;
        }
    }
}

ํ•œ์ค„์”ฉ ์„ค๋ช…ํ•ด๋ณด์ž!

static int half;
static int N;
static int[] team;
static int[][] power;
static int result;

half๋Š” N์˜ ์ ˆ๋ฐ˜ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

team ๋ฐฐ์—ด์„ ํ†ตํ•ด ๊ฐ™์€ ํŒ€์ธ ๊ฒฝ์šฐ ๊ฐ™์€ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

power ๋ฐฐ์—ด์€ ์ฃผ์–ด์ง„ ๋Šฅ๋ ฅ์น˜์˜ ๊ฐ’์ด ๋‹ด๊ฒจ์žˆ๋‹ค.

static void dfs(int member, int x) {
      if (member == half) {
          int score1 = 0, score2 = 0;
          for (int k = 0; k < N; k++) {
              for (int u = k + 1; u < N; u++) {
                  if (team[k] == 0 && team[u] == 0)
                      score2 += power[k][u] + power[u][k];
                  if (team[k] == 1 && team[u] == 1)
                      score1 += power[k][u] + power[u][k];
              }
          }

dfs ๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด์ฃผ์—ˆ๋‹ค.

member๋Š” 1๋ฒˆ ํŒ€์— ์†ํ•œ ๋ฉค๋ฒ„์˜ ์ˆ˜์ด๋‹ค. ์ด์›์˜ ์ ˆ๋ฐ˜์ด 1๋ฒˆ ํŒ€์ด ๋˜์—ˆ๋‹ค๋ฉด ํŒ€ ๊ตฌ์„ฑ์ด ๋ชจ๋‘ ์ข…๋ฃŒ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

์ด์ค‘ loop๋ฅผ ํ†ตํ•ด N๋ช…์„ ์กฐ์‚ฌํ•œ๋‹ค. ์ด๋•Œ 2๋ฒˆ ๊ณ„์‚ฐ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์•ˆ์˜ loop๋Š” k+1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. k์™€ u์˜ ํŒ€์ด ๊ฐ™์œผ๋ฉด ๊ฐ score ๋ณ€์ˆ˜์— ๋Šฅ๋ ฅ์น˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋”ํ•ด์ค€๋‹ค.

if (Math.abs(score1 - score2) < result)
    result = Math.abs(score1 - score2);
return;

๋‘ ๋Šฅ๋ ฅ์น˜ ๊ณ„์‚ฐ ๊ฐ’์˜ ์ฐจ๊ฐ€ ๊ฒฐ๊ณผ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ ๊ฐฑ์‹ ํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด return ํ•ด์ค€๋‹ค.

for (int i = x + 1; i < N; i++) {
    team[i] = 1;
    dfs(member + 1, i);
    team[i] = 0;
}

for๋ฌธ์„ x+1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ด์œ ๋Š” 0๋ฒˆ ๋ฉค๋ฒ„๊ฐ€ 0ํŒ€๊ณผ 1ํŒ€ ์ค‘ ์–ด๋””์— ์†ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ํŒ€์˜ ๋ฉค๋ฒ„๊ฐ€ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

0๋ฒˆ ๋ฉค๋ฒ„๋Š” 0ํŒ€์œผ๋กœ ๊ณ ์ •๋˜๊ฒ ์ง€๋งŒ ๋‚˜๋จธ์ง€ ๋ฉค๋ฒ„๋“ค์€ ์–ด๋А ํŒ€์—๋“  ์†ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์„ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Comments