[정리] 백트래킹

BAMDAL.Dev·2022년 6월 26일
0

정리

목록 보기
3/11

백트래킹

  • 해를 찾는 도중 해가 아니어서 막히게 되면, 되돌아가서 다시 해를 찾는 기법이다.
  • 다시 되돌아가며 경우의 수를 줄이는 방법을 가지치기한다고 말하며, 얼마나 가지치기를 잘하냐에 따라서 효율성이 결정된다.

문제와 코드를 통해서 알아보겠다

  • 백준 (15649번) N과 M(1)

문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열

풀이

package BackTracking;

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

public class NM1 {
    static boolean[] check;
    static void permu(int[] tmp,StringBuilder sb, int level,int m){
        if(level == m){
            System.out.println(sb.toString());
            return;
        }
//        if 조건으로 백트래킹 을 한다.
        for(int i = 0;i<tmp.length;i++){
            if(check[i])
                continue;
            check[i] = true;
            if(level == 0){
                permu(tmp,sb.append(tmp[i]),level+1,m);
                sb.setLength(sb.length()-1);
            }else{
                permu(tmp,sb.append(" "+tmp[i]),level+1,m);
                sb.setLength(sb.length()-2);
            }
            check[i] = false;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        int[] tmp = new int[n];
        check= new boolean[n];

        for(int i = 0;i<n;i++) tmp[i] = i + 1;

        permu(tmp,new StringBuilder(),0,m);
    }
}
profile
궁금증을 가지며 코딩하는 개발JA 주니어🐻

0개의 댓글