백준문제풀이

백준 [15649] , DFS(백트레킹) (Java)

리모찌 2023. 5. 15. 19:04

 이문제에서 중복을 없애려면  그해당 값을 방문하지않고 방문처리하면됨   그리고 DFS 는 해당노드가 방문하지않은상태일때, 재귀호출 

 

DFS에대한 이해도가 예전보다 많이 올랐다.

 

 

 

 

 

 

 

 

 

 

아래는 작업한 코드전체 

/*pink.경우의수는 n X m+1 개만큼의 갯수가 나오게됨 , m  (배열의 인덱스는 0부터 시작)
* pink. val 요소를 만들어서  배열마다의 요소를 val 요소에 넣음
*/




package 백준15649;
import java.util.Scanner;
public class Main {

public static int[] arr; //red.길이가 M인 순열을 저장하기 위한 배열 arr을 선언
public static boolean[] visit; //red. 방문 여부를 위한 boolean 배열

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

    int n =  sc.nextInt();
    int m =  sc.nextInt();

    arr= new int [m];  //red. arr 배열을 길이 m으로 초기화
        //blue. 끝나는지점 : m   , 순열의 길이를나타내기때문에 m  으로 초기화
        //blue . m 은 순열의 길이 ( 가로에 출력되는길이 )
    visit = new boolean[n];//red.  visit 배열을 길이 n으로 초기화
                            //blue. ( 입력받은 n 부터 시작해야하기때문, 시작값을 0 이아닌n으로변경)
                            //blue. 숫자의범위인  n 만큼을 방문처리해야함-> 여러개의 트리중 한쪽의 트리(n)가 끝날때마다
                            //blue.    체크해야하기때문
        dfs(n,m,0); // red.    dfs 메소드로 순열을 재귀해서 구함, 초기깊이 = 0
        }
public static void dfs(int n , int m ,int depth){

if(depth==m) {              //red.  depth 가  m 에 도달하면 순열 완성
    for(int  val : arr){    // arr배열의 모든 요소를 val 에  대입하며 반복

        System.out.print(val+" "); //red. val을 공백 포함하여 출력
                                    //blue.   저장된 val 이 수열이된다.

    }
    System.out.println();
    return ;            //green.  DFS 메소드 종료
  }

for (int i = 0; i <n; i ++){ //red. 0부터 N-1까지 반복하면서 각 노드를 방문

if(!visit[i]){ //red.: i번째 노드를 방문하지 않았다면 실행
    visit[i] = true;        //blue. i번째 노드를 방문했다고 변경 ,중복 방지
    arr[depth] = i+1;       // depth 위치에 i+1 값 저장
    dfs(n,m,depth+1);  // red. 다음 깊이로 재귀호출
    visit[i]= false;        //green.  모든 자식노드 방문이 끝나고 돌아오면   초기시작점이었던 i 번째 노드를
                            //  방문하지않은상태로 다시 변경
            }
        }
    }
}