CodingTest/Java

BOJ_14889 : μŠ€νƒ€νŠΈμ™€ 링크

Soom_1n 2023. 4. 7. 15:38

πŸ‘‰ 문제링크

 

14889번: μŠ€νƒ€νŠΈμ™€ 링크

예제 2의 κ²½μš°μ— (1, 3, 6), (2, 4, 5)둜 νŒ€μ„ λ‚˜λˆ„λ©΄ 되고, 예제 3의 κ²½μš°μ—λŠ” (1, 2, 4, 5), (3, 6, 7, 8)둜 νŒ€μ„ λ‚˜λˆ„λ©΄ λœλ‹€.

www.acmicpc.net



πŸ”Έ 문제 뢄석 πŸ”Έ

  • Nλͺ… μ€‘μ—μ„œ N/2λͺ…을 λ½‘μ•˜μ„λ•Œ λ‚˜μ˜€λŠ” μ‹œλ„ˆμ§€ 차이의 μ΅œμ†Œκ°’μ„ 좜λ ₯ν•œλ‹€.
  • Nλͺ…μ—μ„œ N/2λ₯Ό λ½‘λŠ” μ‘°ν•© λ¬Έμ œμ΄λ‹€.
    • λ°˜λŒ€ νŒ€μœΌλ‘œ λ½‘νžˆλ©΄ 같은 값을 μ€‘λ³΅μœΌλ‘œ κ²€μ‚¬ν•˜κ²Œ λ˜μ§€λ§Œ, μ‹œκ°„λ³΅μž‘λ„κ°€ ν—ˆμš©λ²”μœ„ λ‚΄μ΄λ―€λ‘œ κ°μ•ˆν•΄λ„ λœλ‹€.
    • μ‘°ν•©μœΌλ‘œ 뽑아 μ‹œλ„ˆμ§€ 차이의 μ΅œμ†Œκ°’μ„ μ—…λ°μ΄νŠΈν•œλ‹€.

πŸ”Έ μ½”λ“œ πŸ”Έ

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

public class Main {
    private static int N, ans = Integer.MAX_VALUE;
    private static int[][] arr;
    private static boolean[] visited;

    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        arr = new int[N][N];
        visited = new boolean[N];

        StringTokenizer st = null;
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        // Combination
        comb(0, 0, 0);

        // Output
        System.out.println(ans);
    }

    private static boolean comb(int start, int cnt, int sum) {
        if (cnt == N / 2) {
            int temp = 0;
            for (int i = 0; i < N-1; i++) {
                for (int j = i+1; j < N; j++) {
                    if (!visited[i] && !visited[j])
                        temp += arr[i][j] + arr[j][i];
                }
            }

            ans = Math.min(ans, Math.abs(sum - temp));
            return ans == 0;
        }

        for (int i = start; i < N; i++) {
            if (!visited[i]) {
                visited[i] = true;

                int temp = 0;
                for (int j = 0; j < i; j++) {
                    if (visited[j])
                        temp += arr[i][j] + arr[j][i];
                }

                if(comb(i + 1, cnt + 1, sum + temp)) return true;

                visited[i] = false;
            }
        }
        return false;
    }
}

πŸ”Έ μ½”λ“œ 해석 πŸ”Έ

  • μž¬κ·€ λ©”μ„œλ“œ combλ₯Ό μ΄μš©ν•΄ 쑰합을 κ΅¬ν˜„ν•œλ‹€.
    • νŒ€μ›μ„ κ³ λ₯Ό λ•Œ λ§ˆλ‹€ μ‹œλ„ˆμ§€ 값을 λˆ„μ ν•΄μ„œ μ‚¬μš©ν•œλ‹€.
    • νŒ€μ›μ„ λ‹€ 골랐으면 λ°˜λŒ€μͺ½ νŒ€μ›λ“€μ˜ μ‹œλ„ˆμ§€ κ°’ 총합도 κ³„μ‚°ν•œλ‹€.
    • μ‹œλ„ˆμ§€ κ°’ 차이λ₯Ό ans에 μ—…λ°μ΄νŠΈν•œλ‹€.
  • λͺ¨λ“  경우의 수λ₯Ό ν™•μΈν•˜κ³  ansλ₯Ό 좜λ ₯ν•œλ‹€.

πŸ”Έ end πŸ”Έ

  • μ‹œκ°„ μ΄ˆκ³Όκ°€ λ– μ„œ 계산값을 μž¬κ·€ λ©”μ„œλ“œμ—μ„œ sum으둜 λ“€κ³ λ‹€λ…”λŠ”λ°, 사싀 ν•˜μ§€ μ•Šμ•„λ„ 되고 λ‹€λ₯Έ λΆ€λΆ„μ—μ„œ κ΅¬ν˜„ μ‹€μˆ˜κ°€ μžˆμ—ˆλ˜ 것 κ°™λ‹€.

728x90