나는 DFS로 풀었다

 

 

 

 

처음에 작성한 코드

 

public class Baek_2644 {
    static int[][] family;
    static boolean[] check;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int A = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        int S = Integer.parseInt(st.nextToken());
        int E = Integer.parseInt(st.nextToken());

        int N = Integer.parseInt(br.readLine());
        family = new int[A+1][A+1];
        check = new boolean[A+1];

        while (N-->0){
            st = new StringTokenizer(br.readLine()," ");
            int a= Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            family[a][b] = family[b][a] =1;
        }
        System.out.println(cd(S,E,0));


    }
    static int cd(int start,int end,int cnt){
        if(start==end) return cnt;
        check[start] = true; //방문했다고 표시하고
        for(int i=1; i< check.length; i++){
            if(family[start][i]==1&&!check[i]){ //start와 연결되어있으면서 방문하지 않았다면
                check[i] = true;
                return cd(i,end,cnt+1);
            }
        }
        return -1;
    }
}

그러나 예상과는 다르게 어떠한 경우에도 -1이 출력되었다

 

 

위 코드는 재귀호출 결과를 바로 반환한다. 

따라서 재귀 호출 결과가 -1이 아닌 경우에도 더 이상 반복하지 않고 즉시 -1을 반환하므로, 시작점과 도착점 사이의 경로가 여러 개 있을 때, 모든 경로를 찾아낼 수 없다.

 

따라서 temp에 cd값을 저장해주고 -1이 아닐 경우에 cd값을 리턴해주는 식으로 변경하였다

이렇게 하면 -1이 아닌 경우에는 재귀 호출을 반복하여 cnt값을 제대로 계산하여 return할 수 있다.

 

 

 

 

 

cd메서드에 다음과 같이 반환하기 전 재귀 호출의 결과가 -1인지 확인하는 로직을 추가하였고,

문제를 해결할 수 있었다

    static int cd(int start,int end,int cnt){
        if(start==end) return cnt;
        check[start] = true; //방문했다고 표시하고

        for(int i=1; i< check.length; i++){
            if(family[start][i]==1&&!check[i]){ //start와 연결되어있으면서 방문하지 않았다면
                check[i] = true;
                int temp = cd(i,end,cnt+1);
                if(temp!=-1) return temp;
            }
        }

        return -1; //start와 end도 아니고(찾지 못했고) 더이상 연결된 노드도 없다면 -1 return
    }
}

 

 

 

'Algorithm' 카테고리의 다른 글

백준 1663 -XYZ 문자열  (0) 2023.05.03
[Java] 이항계수 /백준 1010, 11051  (0) 2023.05.01
[모듈러 연산] 백준 11726 /프로그래머스 - 피보나치 수  (0) 2023.04.21
[Java]Quick Sort  (2) 2023.04.21
[Java]Merge sort  (0) 2023.04.20
복사했습니다!