์•Œ๊ณ ๋ฆฌ์ฆ˜/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / Programmers Level 3 ] ๋ชจ๋‘ 0์œผ๋กœ ๋งŒ๋“ค๊ธฐ ( JAVA / ์ž๋ฐ” )

KIMHYEYUN 2021. 10. 19. 17:33
๋ฐ˜์‘ํ˜•

https://programmers.co.kr/learn/courses/30/lessons/76503

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋ชจ๋‘ 0์œผ๋กœ ๋งŒ๋“ค๊ธฐ

๊ฐ ์ ์— ๊ฐ€์ค‘์น˜๊ฐ€ ๋ถ€์—ฌ๋œ ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹ค์Œ ์—ฐ์‚ฐ์„ ํ†ตํ•˜์—ฌ, ์ด ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ์ ๋“ค์˜ ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ž„์˜์˜ ์—ฐ๊ฒฐ๋œ ๋‘ ์ ์„ ๊ณจ๋ผ์„œ ํ•œ์ชฝ์€ 1 ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ๋‹ค๋ฅธ ํ•œ

programmers.co.kr

 

๋ฌธ์ œ


๊ฐ ์ ์— ๊ฐ€์ค‘์น˜๊ฐ€ ๋ถ€์—ฌ๋œ ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹ค์Œ ์—ฐ์‚ฐ์„ ํ†ตํ•˜์—ฌ, ์ด ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ์ ๋“ค์˜ ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

  • ์ž„์˜์˜ ์—ฐ๊ฒฐ๋œ ๋‘ ์ ์„ ๊ณจ๋ผ์„œ ํ•œ์ชฝ์€ 1 ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ๋‹ค๋ฅธ ํ•œ์ชฝ์€ 1 ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๋ชจ๋“  ํŠธ๋ฆฌ๊ฐ€ ์œ„์˜ ํ–‰๋™์„ ํ†ตํ•˜์—ฌ ๋ชจ๋“  ์ ๋“ค์˜ ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ฃผ์–ด์ง„ ํŠธ๋ฆฌ์— ๋Œ€ํ•ด์„œ ํ•ด๋‹น ์‚ฌํ•ญ์ด ๊ฐ€๋Šฅํ•œ์ง€ ํŒ๋ณ„ํ•˜๊ณ , ๋งŒ์•ฝ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ตœ์†Œํ•œ์˜ ํ–‰๋™์„ ํ†ตํ•˜์—ฌ ๋ชจ๋“  ์ ๋“ค์˜ ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ์˜ ๊ฐ ์ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์˜๋ฏธํ•˜๋Š” 1์ฐจ์› ์ •์ˆ˜ ๋ฐฐ์—ด a์™€ ํŠธ๋ฆฌ์˜ ๊ฐ„์„  ์ •๋ณด๋ฅผ ์˜๋ฏธํ•˜๋Š” edges๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ํ–‰๋™์„ ํ†ตํ•ด ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ์ ๋“ค์˜ ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด -1์„, ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ตœ์†Œ ๋ช‡ ๋ฒˆ๋งŒ์— ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ์ฐพ์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”. (๋งŒ์•ฝ ์ฒ˜์Œ๋ถ€ํ„ฐ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ์ •์ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ 0์ด๋ผ๋ฉด, 0์„ return ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

์ œํ•œ ์‚ฌํ•ญ


  • a์˜ ๊ธธ์ด๋Š” 2 ์ด์ƒ 300,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
    • a์˜ ๋ชจ๋“  ์ˆ˜๋Š” ๊ฐ๊ฐ -1,000,000 ์ด์ƒ 1,000,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
    • a[i]๋Š” i๋ฒˆ ์ •์ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • edges์˜ ํ–‰์˜ ๊ฐœ์ˆ˜๋Š” (a์˜ ๊ธธ์ด - 1)์ž…๋‹ˆ๋‹ค.
    • edges์˜ ๊ฐ ํ–‰์€ [u, v] 2๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์ด๋Š” u๋ฒˆ ์ •์ ๊ณผ v๋ฒˆ ์ •์ ์ด ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • edges๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ทธ๋ž˜ํ”„๋Š” ํ•ญ์ƒ ํŠธ๋ฆฌ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. 

์˜ˆ์ œ


์ž…์ถœ๋ ฅ ์˜ˆ

a edges result
[-5,0,2,1,2] [[0,1],[3,4],[2,3],[0,3]] 9
[0,1,0] [[0,1],[1,2]] -1

์ž…์ถœ๋ ฅ ์˜ˆ #1

  • ๋‹ค์Œ ๊ทธ๋ฆผ์€ ์ฃผ์–ด์ง„ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ์ •์ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. 2๋ฒˆ ์ •์ ๊ณผ 3๋ฒˆ ์ •์ ์„ ์„ ํƒํ•˜์—ฌ 2๋ฒˆ ์ •์ ์€ 1 ๊ฐ์†Œ์‹œํ‚ค๊ณ , 3๋ฒˆ ์ •์ ์€ 1 ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. (2๋ฒˆ ๋ฐ˜๋ณต)
  2. 3๋ฒˆ ์ •์ ๊ณผ 4๋ฒˆ ์ •์ ์„ ์„ ํƒํ•˜์—ฌ 4๋ฒˆ ์ •์ ์€ 1 ๊ฐ์†Œ์‹œํ‚ค๊ณ , 3๋ฒˆ ์ •์ ์€ 1 ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. (2๋ฒˆ ๋ฐ˜๋ณต)
  3. 0๋ฒˆ ์ •์ ๊ณผ 3๋ฒˆ ์ •์ ์„ ์„ ํƒํ•˜์—ฌ 3๋ฒˆ ์ •์ ์€ 1 ๊ฐ์†Œ์‹œํ‚ค๊ณ , 0๋ฒˆ ์ •์ ์€ 1 ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. (5๋ฒˆ ๋ฐ˜๋ณต)
  • ๋ชจ๋“  ์ •์ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ํ–‰๋™ ํšŸ์ˆ˜๋Š” 9๋ฒˆ์ด๋ฏ€๋กœ, 9๋ฅผ return ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #2

  • ์ฃผ์–ด์ง„ ํŠธ๋ฆฌ๋Š” ๋ชจ๋“  ์ •์ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, -1์„ return ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํ’€์ด


๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์ด 0์ด ๋˜์ง€ ์•Š์œผ๋ฉด ๐Ÿ‘‰ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ โŒ return -1

๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์ด 0์ด๋ฉด ๐Ÿ‘‰  ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๊ฐ€ 1๊ฐœ์ธ ๋…ธ๋“œ๋ถ€ํ„ฐ 0์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ โ€ผ๏ธ

1๏ธโƒฃ ํ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๊ฐ€ 1๊ฐœ์ธ ๋…ธ๋“œ ์ฆ‰, leaf node ๋“ค์„ ์ €์žฅ

2๏ธโƒฃ ํ์— ์ €์žฅ๋œ ๋…ธ๋“œnow์˜ ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ

    โžก๏ธ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œnext์— now์˜ ๊ฐ€์ค‘์น˜๋งŒํผ โœš

    โžก๏ธ next์˜ indegree −

3๏ธโƒฃ next์˜ indegree๊ฐ€ 1 ์ด๋ฉด ํ์— ์ถ”๊ฐ€

 ์ฝ”๋“œ

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

public class ๋ชจ๋‘0์œผ๋กœ๋งŒ๋“ค๊ธฐ {
    
    static ArrayList<Integer> adj[];
    static boolean[] isVisited;
    static int[] indegree;
    static long[] longA;
    static long answer;
    public static long solution(int[] a, int[][] edges) {
        answer = 0;

        longA = new long[a.length];
        adj = new ArrayList[a.length];
        indegree = new int[a.length];
        isVisited = new boolean[a.length];

        long sum = 0;
        for(int i = 0 ; i < a.length ; i++){
            sum += a[i];
            longA[i] = a[i];
            adj[i] = new ArrayList<>();
        }

        if(sum != 0)
            return -1;

        for(int i = 0 ; i < edges.length ; i++){
            adj[edges[i][0]].add(edges[i][1]);
            adj[edges[i][1]].add(edges[i][0]);
            
            indegree[edges[i][0]]++;
            indegree[edges[i][1]]++;
        }
        
        BFS();

        return answer;
    }

    private static void BFS() {
        Queue<Integer> queue = new LinkedList<>();

        for(int i = 0 ; i < indegree.length ; i++){
            if(indegree[i] == 1)
                queue.offer(i);
        }

        while(!queue.isEmpty()){
            int now = queue.poll();
            isVisited[now] = true;

            for(int next : adj[now]){
                if(!isVisited[next]){
                    indegree[next]--;
                    longA[next] += longA[now];
                    answer += Math.abs(longA[now]);
                    longA[now] = 0;

                    if(indegree[next] == 1)
                        queue.offer(next);
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] a = {-5, 0, 2, 1, 2};
        int[][] edges = {{0, 1}, {3, 4}, {2, 3}, {0,3}};

        System.out.println(solution(a, edges));
    }
}

 


 

728x90
๋ฐ˜์‘ํ˜•