문제풀이/DFS&BFS

[PS] Programmers - 혼자 놀기의 달인 ( DFS )

IT록흐 2024. 1. 29. 22:01
반응형
 

프로그래머스

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

programmers.co.kr

 

◎ 문제풀이

 

상자 안에는 다음 오픈할 상자의 번호가 적혀있는 카드가 들어있다. 임의의 한 상자를 오픈하여 연달아 오픈해서 이미 오픈한 상자를 만날 때까지 오픈한다고 했을 때, 연달아 오픈할 수 있는 상자의 개수가 가장 많은 것과 그 다음 많은 것의 곱을 구하는 문제이다. 

 

문제가 복잡해보이지만 싸이클을 찾는 문제이다. 

방향그래프에서 싸이클을 찾는 문제는 DFS 알고리즘을 사용하면 된다.

 

DFS 알고리즘으로 가장 큰 싸이클과 그 다음 싸이클을 찾아서 싸이클 안의 상자수를 곱하면 된다.

 

주의할 점은 입력으로 주어진 배열은 0부터 인덱스가 시작하므로 1부터 시작하는 배열을 새로 만들어줘야한다. ( 문제를 잘못 이해해서 여기서 조금 헤매었다. )

 

 

◎ 코드

class Solution {
    
    boolean[] visited;
    boolean[] isCycle;
    int cycleCount;
    int[] boxArr;
    
    public int solution(int[] cards) {
        
        boxArr = new int[cards.length+1];
        
        for(int i=0;i<cards.length;i++){
            boxArr[i+1] = cards[i];
        }

        visited = new boolean[cards.length+1];
        isCycle = new boolean[cards.length+1];
        
        int boxGroup1 = 0;
        int boxGroup2 = 0;
        
        for(int i=1;i<boxArr.length;i++){
            
            if(isCycle[i]) continue;
            
            cycleCount = 0;
            dfs(i);
            
            if( cycleCount > boxGroup1 ){
                boxGroup2 = boxGroup1;
                boxGroup1 = cycleCount;
            }
            else if( cycleCount == boxGroup1){
                boxGroup2 = cycleCount;
            }else{
                if( cycleCount > boxGroup2) boxGroup2 = cycleCount;
            }
            
        }
        
        return boxGroup1 * boxGroup2;
            
 
    }
    
    public void dfs(int num){
        int nextNum = boxArr[num];
        
        if(visited[nextNum]) {
            if(isCycle[num]) return;
            
            isCycle[num] = true;
            cycleCount++;
        }else{
            visited[nextNum] = true;
        }
        
        dfs(nextNum);
        
    }
}
반응형