[백준 10597] 순열장난(Java)

최민길(Gale)·2023년 5월 31일
1

알고리즘

목록 보기
71/172

문제 링크 : https://www.acmicpc.net/problem/10597

이 문제는 백트래킹을 이용하여 풀 수 있습니다. 문제에서 주어진 조건이 최대 50개의 수로 이루어진 순열이므로 조건의 제한 범위가 작아 백트래킹으로 충분히 진행 가능하고, 문자열을 각각 한 글자씩과 두 글자씩 나누어 최종적으로 모든 문자열을 나누었을 때 check 배열의 1부터 지금까지 나눈 수 중 가장 큰 수까지 모두 체크가 되어있는지를 확인하여 만약 그렇다면 해당 순열을 출력합니다.

다음은 코드입니다.

import java.util.*;
import java.io.*;

class Main{
    static String str;
    static int N;
    static boolean[] check = new boolean[51];

    static void backtracking(int idx, int max, String ans){
        if(idx==N){
            for(int i=1;i<=max;i++){
                if(!check[i]) return;
            }

            System.out.println(ans);
            System.exit(0);
        }

        String s = str.substring(idx,idx+1);
        int num = Integer.parseInt(s);
        if(!check[num]){
            check[num] = true;
            backtracking(idx+1, (num>max)? num : max, ans+" "+s);
            check[num] = false;
        }

        if(idx < N-1){
            s = str.substring(idx, idx+2);
            num = Integer.parseInt(str.substring(idx, idx+2));
            if(num<51 && !check[num]){
                check[num] = true;
                backtracking(idx+2, (num>max)? num : max, ans+" "+s);
                check[num] = false;
            }
        }
    }

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        str = br.readLine();
        N = str.length();
        backtracking(0, 0, "");

    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글