๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/SWEA

[SWEA] 1767. ํ”„๋กœ์„ธ์„œ ์—ฐ๊ฒฐํ•˜๊ธฐ (Java / ์ž๋ฐ”)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2023. 2. 13.

<๋ฌธ์ œ ๋งํฌ>

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV4suNtaXFEDFAUf 

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com

 

<ํ’€์ด ์ „๋žต>

1. ๋ฌธ์ œ์— ์ œ์‹œ๋œ N์˜ ๊ฐœ์ˆ˜์™€ ํ”„๋กœ์„ธ์„œ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๊ฐ€ 12๋กœ ์ž‘์€ ํŽธ์ด๊ธฐ์— ์™„์ „ํƒ์ƒ‰์œผ๋กœ ์ถฉ๋ถ„ํžˆ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

2. ํ•ด๋‹น ํ”„๋กœ์„ธ์„œ์˜ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ๋ชจ๋“  ํ”„๋กœ์„ธ์„œ๋ฅผ ์„ ํƒ/๋น„์„ ํƒํ•˜๋ฉด์„œ 4๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆํ–ˆ๋‹ค.

 

<์ •๋‹ต ์ฝ”๋“œ>

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

public class Solution {

//    ์ž…์ถœ๋ ฅ
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringBuilder sb = new StringBuilder();
    static StringTokenizer st;

//    ๋ณ€์ˆ˜
    private static int T, N, totalCore, maxCore, minCable;
    private static int[][] arr;
    private static int[] dr = {-1, 1, 0, 0};
    private static int[] dc = {0, 0, -1, 1};
    private static List<Core> coreList;

//    ์ฝ”์–ด
    private static class Core {
        int r, c;
        public Core(int r, int c) {
            this.r = r;
            this.c = c;
        }
    }

//    ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ์—ฌ๋ถ€
    private static boolean isAvailable(Core core, int d){
        int nr = core.r;
        int nc = core.c;

        // ํ”„๋กœ์„ธ์„œ์—์„œ ์‹œ์ž‘
        while (true) {
            nr += dr[d];
            nc += dc[d];

            // ์—ฐ๊ฒฐ ์„ฑ๊ณต
            if (nr < 0 || nc < 0 || nr >= N || nc >= N) {
                return true;
            }
            // ์—ฐ๊ฒฐ ์‹คํŒจ
            if (arr[nr][nc] >= 1){
                return false;
            }
        }
    }


//    ์ „์„  ์„ค์น˜
    private static int setCable(Core core, int d, int k) {

        int nr = core.r;
        int nc = core.c;
        int cnt = 0;

        while (true) {
            nr += dr[d];
            nc += dc[d];

            if (nr < 0 || nc < 0 || nr >= N || nc >= N) {
                return cnt;
            }

            arr[nr][nc] = k;
            cnt ++;
        }
    }


    // ๋ฐฑํŠธ๋ž˜ํ‚น
    private static void backTracking(int depth, int coreCnt, int cableLen) {

        // ๊ฐ€์ง€์น˜๊ธฐ
        if (totalCore - depth + coreCnt <maxCore) {
            return;
        }


        // ๋ฐ˜ํ™˜์กฐ๊ฑด
        if (depth == totalCore) {
            // ์ฝ”์–ด, ์ผ€์ด๋ธ” ๊ฐฑ์‹ 
            if (coreCnt > maxCore) {
                maxCore = coreCnt;
                minCable = cableLen;
            }
            // ์ผ€์ด๋ธ” ๊ฐฑ์‹ 
            else if (coreCnt == maxCore) {
                minCable = Math.min(cableLen, minCable);
            }
            return;
        }

//        ์ฝ”์–ด ๊ฐ€์ ธ์˜ค๊ธฐ
        Core curr = coreList.get(depth);

//        ์—ฐ๊ฒฐ o
        for (int d = 0; d < 4; d++) {
//            ํ•ด๋‹น ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ
            if (isAvailable(curr, d)){
//                ์ „์„  ์„ค์น˜
                int cnt = setCable(curr, d, 2);
//                ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰
                backTracking(depth + 1, coreCnt + 1, cableLen + cnt);
//                ๋ฐฑํŠธ๋ž˜ํ‚น
                setCable(curr, d, 0);
            }
        }

//        ์—ฐ๊ฒฐ x
        backTracking(depth + 1, coreCnt, cableLen);

    }

    public static void main (String[] args) throws IOException {
//        ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค
        T = Integer.parseInt(br.readLine());

        for (int t = 1; t <= T; t++) {
//            ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”
           N = Integer.parseInt(br.readLine());
           arr = new int[N][N];
           coreList = new ArrayList<>();
           totalCore = 0;

            for (int r = 0; r < N; r++) {
                st = new StringTokenizer(br.readLine());
                for (int c = 0; c < N; c++) {
//                    ํ”„๋กœ์„ธ์„œ ๋ฐ ์ฝ”์–ด ์ž…๋ ฅ
                    arr[r][c] = Integer.parseInt(st.nextToken());

                    if (arr[r][c] == 1) {

                        coreList.add(new Core(r, c));
                    }

                    }
                }

//            ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”
            maxCore = 0;
            minCable = Integer.MAX_VALUE;
            totalCore = coreList.size();

//            ๋ฐฑํŠธ๋ž˜ํ‚น
            backTracking(0, 0, 0);
            
            sb.append("#" + t + " "  + minCable + "\n");

            }
            System.out.println(sb.toString());
        }

    }

'โญ Problem_Solving > SWEA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[SWEA] 1868. ํŒŒํ•‘ํŒŒํ•‘ ์ง€๋ขฐ์ฐพ๊ธฐ (Java / ์ž๋ฐ”)  (0) 2023.02.15

๋Œ“๊ธ€