문제 풀이(48)

Youngseon Kim·2023년 10월 28일

https://www.acmicpc.net/problem/1038

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


public class Main {

    static int N;
    static boolean[] visited;
    static ArrayList<Long>list = new ArrayList<>();
    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());

        visited = new boolean[10];

        for (int i = 0; i < 10 ; i++) {
        
            for (int j = 0; j <= 9; j++) {
        
                rec_func(0, String.valueOf(j), i);
        
            }
        }

        if (N >= list.size()) {
            System.out.println(-1);
            return;
        }

        System.out.println(list.get(N));
    }

    public static void rec_func(int k, String s, int limit )
    {
        

        if (k == limit) {
            
            list.add(Long.parseLong(s));

        }else{

            for (int i = 0; i <= 9; i++) {
                if(visited[i])continue;
                if(s.charAt(k) > String.valueOf(i).charAt(0))
                {
                    visited[i] = true;
                    rec_func(k + 1, s+String.valueOf(i), limit);
                    visited[i] = false;
                }
               
            }

        }

    }
}

rec_func 메서드:
재귀적으로 호출되며, 현재까지 생성된 숫자와 방문한 숫자를 기반으로 순열을 만든다. 메서드는 다음과 같은 매개변수를 가진다.

k: 현재까지 생성된 숫자의 개수를 나타내는 변수이다.
s: 현재까지 생성된 숫자를 문자열로 표현한 값이다.
limit: 순열의 길이를 나타내는 변수로, 목표 순열의 길이에 도달하면 순열을 리스트에 추가한다.

Main 메서드:
사용자로부터 N 값을 입력받는다.
0부터 9까지의 숫자에 대해 rec_func 메서드를 호출하여 순열을 생성한다. 이 과정은 중첩된 반복문을 통해 이루어진다.
생성된 순열이 list에 저장된다.
N이 list의 크기보다 큰 경우 -1을 출력하고 프로그램을 종료한다.
그렇지 않은 경우, N번째로 작은 순열을 출력한다.

0개의 댓글