쉬운 프로그래밍

[알고리즘] 백준 15649 N과 M (1) 본문

알고리즘/백트래킹

[알고리즘] 백준 15649 N과 M (1)

쉬운형 2021. 1. 6. 20:53

www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

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

public class BOJ_15649 {
    static int n;
    static int m;
    static boolean[] visited;
    static int[] arr;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        StringTokenizer st = new StringTokenizer(s, " ");
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        visited = new boolean[n + 1];
        arr = new int[m];

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

    static void dfs(int d) {
        if (d == m) {
            for (int i = 0; i < arr.length; i++) {
                sb.append(arr[i]).append(' ');
            }
            sb.append('\n');
            return;
        }

        for (int i = 1; i < n + 1; i++) {
            if (!visited[i]) {
                visited[i] = true;
                arr[d] = i;
                dfs(d + 1);
                visited[i] = false;
            }
        }
    }
}

 

가장 기초적인 백트래킹 문제이다. 이해하는데 어려워 많은 블로그들을 참고하여 풀었다.

 

이 문제는 dfs를 통해서 해결하였다.

 

depth값이 m과 같아질때까지 dfs를 재귀적으로 돌린다. depth값이 m과 같아지면 현재 arr에 들어있는 값들을 StringBuilder에 넣고 return한다.

 

그 후 방문한 정점을 false로 바꾸어 재방문 할 수 있도록 한다.

 

예를들어 N=5, M=5이면

 

1, 2, 3, 4, 5 -> 1,2,3,5,4 이런식으로 된다는 말이다. (DFS)

 

아직 이해가 많이 부족한거같아서 문제를 더 풀어봐야 할 것 같다.

Comments