99ํด๋Ÿฝ ์ฝ”ํ…Œ ์Šคํ„ฐ๋”” 24์ผ์ฐจ TIL : ์™„์ „ํƒ์ƒ‰(ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์ „๋ ฅ๋ง์„ ๋‘˜๋กœ ๋‚˜๋ˆ„๊ธฐ)

2024. 11. 21. 13:32ใ†Algorithm/ํ•ญํ•ด99(4๊ธฐ)

 

 

๐Ÿ”Ž ๋ฌธ์ œ 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/86971

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

 


๐Ÿ’ก ํ’€์ด

- DFS

- ๋ฐฐ์—ด๋กœ ๋œ ํŠธ๋ฆฌ ์ขŒํ‘œ๋“ค์„ LIST๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ์ €์žฅ ex) ๋…ธ๋“œ 1์˜ ์—ฐ๊ฒฐ๋œ ์ขŒํ‘œ๋Š” wireList[1] ์— ์ €์žฅ

- divideNetwork(n, wireList, wires[i]) : ์ฃผ์–ด์ง„ wires ์ด์ฐจ๋ฐฐ์—ด์„ ํ•˜๋‚˜์”ฉ ๊ฐ€์ง€๊ณ  ์˜ค๋ฉด์„œ ํ•ด๋‹น ์—ฐ๊ฒฐ(wires[i])์„ ํ•ด์ œ

    1. wireList์—์„œ ๋Š์€ ์—ฐ๊ฒฐ ์ขŒํ‘œ๋ฅผ ์ œ๊ฑฐ ex) wireList[edge[0]].remove((Object)edge[1]);

    2. ๋Š์€ ๋…ธ๋“œ ๊ฐ๊ฐ์—์„œ๋ถ€ํ„ฐ dfs ์ถœ๋ฐœ  ex ) dfs(n, wireList, new boolean[n+1], edge, edge[0], true);

    3. cnt1, cnt2์— ๊ฐ๊ฐ ๋‘๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ ์ง„ ๊ทธ๋ฃน๋“ค์ด ๋ช‡๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š”์ง€๋ฅผ ์ €์žฅ
    4. ์ดํ›„ cnt1, cnt2๋ฅผ ๋บ€ ์ ˆ๋Œ€๊ฐ’์ค‘์— ์ตœ์†Œ๊ฐ’์„ ์ €์žฅ

 

import java.util.ArrayList;
import java.util.List;

class Solution {
    public int solution(int n, int[][] wires) {
  
        List<Integer>[] wireList = new ArrayList[n+1]; 
		
		for(int i=1;i<=n;i++) {
			wireList[i] = new ArrayList<Integer>();
		}
		
		for(int i=0;i<wires.length;i++) {
				wireList[wires[i][0]].add(wires[i][1]);
				wireList[wires[i][1]].add(wires[i][0]);
		}
		
		for(int i=0;i<wires.length;i++) {
			divideNetwork(n, wireList, wires[i] );
		}
        
        return min;
    }
    
    private int cnt1= 0;
	private int cnt2= 0;
    private int min= Integer.MAX_VALUE;
	
	private void divideNetwork(int n, List<Integer>[] wireList, int[] edge) {
		wireList[edge[0]].remove((Object)edge[1]);
		wireList[edge[1]].remove((Object)edge[0]);
		
		dfs(n, wireList, new boolean[n+1], edge, edge[0], true);
		dfs(n, wireList, new boolean[n+1], edge, edge[1], false);
		
		int absValue = Math.abs(cnt1-cnt2);
        min = Math.min(absValue,min);
        
        cnt1 = 0;
        cnt2 = 0;
        wireList[edge[0]].add(edge[1]);
		wireList[edge[1]].add(edge[0]);
		
	}
	
	private void dfs(int n, List<Integer>[] wireList, boolean[] visited, int[] edge, int k, boolean isCnt1) {
		visited[k] = true;
        
		if (isCnt1) {
            cnt1++;
        } else {
            cnt2++;
        }

		for(int node : wireList[k]) {
			if(visited[node]==false) {
				dfs(n,wireList,visited,edge,node,isCnt1);
			}
		}
	}
}

 

 

 

 

๐Ÿ“Œ ์˜ค๋Š˜์˜ ํšŒ๊ณ 

๋Šฆ๊ฒŒ ์‹œ์ž‘ํ–ˆ๋”๋‹ˆ ์ œ์ถœ์„ ์‹œ๊ฐ„์•ˆ์— ๋ชปํ•ด์„œ ๋๋‚˜๋ฒ„๋ ธ๋‹ค ,,, 

๊ทธ๋ž˜๋„ ํ•˜๋˜๊ฑฐ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์–ด์„œ ๋„˜ ๋‹ต๋‹ตํ•ด์„œ ๋๊นŒ์ง€ ํ–ˆ์ง€๋งŒ ๐Ÿฅบ๐Ÿฅบ๐Ÿฅบ๐Ÿฅบ๐Ÿฅบ๐Ÿฅบ

์•„์‰ฝ๋‹ค์•„