[백준 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개의 댓글

관련 채용 정보