본문 바로가기

백준

[백준] 15649 N과M(1) (JAVA)

풀이

이 문제는 예전에 풀었던 N-queen과 동일한 백트래킹문제이다. 실버3의 낮은 난이도에 속하는데 백트랙킹의 기본 원리를 알면 쉽게 풀수있다.

백트래킹은 DFS와도 비슷한데 다른점이라면 DFS와는 다르게 해당 노드가 유망하지 않으면 취하지 않는다는 것이라는것이다. 이 문제에서 위의 말을 적용하면 만약 앞서 수열에서 이미 선태한 수가 있다면 선택한 수는 제외하고 순회를 한다는 것이다. 그리 어렵지 않은 코드니 보면 쉽게 이해할수있을듯 하다.

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

class Main{

    public static int N;
    public static int M;
    public static int []arr;
    public static boolean []visit;
    public static BufferedWriter br;
    public static StringBuilder sb = new StringBuilder();

    public static void main(String[] args)throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        arr = new int[M];
        visit = new boolean[N];

        DFS(0);
        System.out.println(sb);
    }

    public static void DFS(int deepth){
        if(deepth == M){
            for(int val : arr)
                sb.append(val).append(' ');
            sb.append('\n');
            return;
        }

        for(int i=0; i<N; i++){
            if(visit[i]==false){
                arr[deepth] = i+1;
                visit[i] = true;
                DFS(deepth+1);
                visit[i] = false;
            }
        }
    }
}

'백준' 카테고리의 다른 글

[백준] 15650 N과 M (2) (JAVA)  (0) 2021.10.02
[백준] 14888 연산자 끼워넣기 (JAVA)  (0) 2021.09.30
[백준] 9663 N-Queen (JAVA)  (0) 2021.09.27
[백준] 2156 포도주 시식 (JAVA)  (0) 2021.09.21
[백준] 2579 계단 오르기 (JAVA)  (0) 2021.09.21