알고리즘/프로그래머스 고득점 Kit

알고리즘) 프로그래머스 Graph, 사이클 제거

Zin0_0 2020. 5. 1. 15:37
반응형

프로그래머스 고득점Kit - Graph

사이클 제거

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

노드의 사이즈를 돌면서 하나씩 제거하고 사이클이 있는지 없는지 체크했다. 결과적으로 정확성 테스트는 다 맞지만, Cycle을 확인하는 메소드를 재귀로 호출하여 효율성은 다 틀린 것 같다. 이후 이 문제를 푼 분들의 로직을 보면서 가장 매력적인 로직을 찾아냈다.

전체 노드의 갯수 -1 개가 되면 사이클이 없다는 것이다. 다만, 컴포넌트의 갯수가 1개가 아닌 2개~n개일 때는 컴포넌트의 갯수도 같이 세줘야 한다는 것이다. 이 로직에 따라 코드를 짜봤지만, 효율적으로 짜지 못해서 그런지 똑같이 효율성이 0이 나왔다..

이 로직에 대해 궁금하신 분들은 여기에 들어가셔서 확인하시면 될 것 같습니다 :)

나중에 꼭 효율성까지 맞는 코드를 짜야겠다.

 

코드

import java.util.LinkedList;

public class KitGraphRemoveCycle {
    private static int solution(int n, int[][] edges) {
        LinkedList<Integer>[] nodes = inItNodes(n);
        nodes = connectNodes(edges, nodes);

        return getCnt(nodes, n);
    }

    private static int getCnt(LinkedList<Integer>[] nodes, int n) {   //
        int result =0;

        for(int i=1; i<=n; i++) {
//            System.out.println(i+"번 째");
            int[] visit = new int[nodes.length];
            result += i;
            for(int j=1; j<=n; j++) {
                if(i!=j && visit[j] !=1) {
                    if (isCycle(i, j, -1, visit, nodes)) {
                        result -= i;
                        break;
                    }
                }
            }
        }

        return result;
    }

    private static boolean isCycle(int expt, int current, int parent, int[] visit, LinkedList<Integer>[] nodes) {
        visit[current] =1;

        for(int next : nodes[current]) {
            if(next != expt) {
                if(visit[next] != 1) {
                    if(isCycle(expt, next, current, visit, nodes)) {
                        return true;
                    }
                } else if(next != parent){
//                    System.out.println("Except = " + expt + "\t curr = " + current + "\t next = "+ next+ "\t parent = " + parent);
                    return true;
                }
            }
        }

        return false;
    }


    private static LinkedList<Integer>[] inItNodes(int n) {
        LinkedList<Integer>[] result = new LinkedList[n+1];

        for(int i=1; i<=n; i++) {
            result[i] = new LinkedList<>();
        }
        return result;
    }

    private static LinkedList<Integer>[] connectNodes(int[][] edges, LinkedList<Integer>[] nodes) {
        for(int[] edge : edges) {
            nodes[edge[0]].offer(edge[1]);
            nodes[edge[1]].offer(edge[0]);
        }
        return nodes;
    }

    /*private static LinkedList<Integer> getCycles(LinkedList<Integer>[] nodes) {
        LinkedList<Integer> result = new LinkedList<>();
        for(int i=1; i<nodes.length; i++) {
            if(nodes[i].size() >2) {
                result.offer(i);
            }
        }
        return result;
    }*/

    public static void main(String[] args) {
        int n=8;
        int[][] edges = {{1,2},{2,3},{3,4},{4,5},{5,6},{6,7},{7,8},{8,1},{2,7},{3,6}};
//        int n=4;
//        int[][] edges = {{1,2},{1,3},{2,3},{2,4},{3,4}};
        System.out.println(solution(n,edges));
    }
}

 

반응형