N과 M (5) 15654

LJM·2023년 1월 18일
0

백준풀기

목록 보기
43/259

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

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

public class Main {

    static int N;
    static int M;

    static int[] inputArr;
    static int[] arr;
    static boolean[] checked;

    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args)throws IOException
    {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input;
        input = br.readLine().split(" ");

        N = Integer.parseInt(input[0]);
        M = Integer.parseInt(input[1]);

        inputArr = new int[N];
        arr = new int[M];
        checked = new boolean[N];

        input = br.readLine().split(" ");
        for(int i = 0; i < N; ++i)
        {
            inputArr[i] = Integer.parseInt(input[i]);
        }

        Arrays.sort(inputArr);

        search(0);

        System.out.println(sb);
    }

    static void search(int depth)
    {
        if(depth == M)
        {
            for(int i = 0; i < arr.length; ++i)
            {
                if(i != arr.length-1)
                    sb.append((arr[i]) + " ");
                else
                    sb.append((arr[i]) + "\n");
            }
            return;
        }

        for(int i = 0; i < N; ++i)
        {
            if(checked[i] == false)
            {
                checked[i] = true;
                arr[depth] = inputArr[i];
                search(depth+1);
                checked[i] = false;
            }
        }
    }
}

시간이 지나서 두번째로 풀어봄
근데 숫자 크기로 정렬해서 출력하는 부분에서 막혀서 고민하다가 예전에 어떻게 풀었는지 참고하였다
한참 고민햇는데 답은 입력된 숫자를 정렬한뒤에 배열을 만들면 되는거였다

시간복잡도 O(N^M)

8 8
1 2 3 4 5 6 7 8
입력하고

dfs 함수 에서 count 변수로 몇번호출되는지 돌려보니 109601 나옴

8의8승은 16,777,216 인데 왜 더 적게 숫자가 나왔을까 중복이 제거되서 그런건가?

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

public class Main {

    static int N;//1~8
    static int M;//1~8
    static Integer[] arr;
    static ArrayList<String> answer = new ArrayList<>();
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(" ");

        N = Integer.parseInt(input[0]);
        M = Integer.parseInt(input[1]);

        input = br.readLine().split(" ");

        ArrayList<Integer> arrInput = new ArrayList<>();
        for(int i = 0; i < N; ++i){
            arrInput.add(Integer.parseInt(input[i]));
        }

        Collections.sort(arrInput);
        boolean visit[] = new boolean[N];
        arr = new Integer[M];

        dfs(0, arrInput, visit);


        answer.stream().forEach( (s)->{
            System.out.println(s);
        });
    }

    public static void dfs(int depth, ArrayList<Integer> arrInput, boolean visit[]){

        sb.setLength(0);
        if(depth == M){
            for (int i = 0; i < arr.length; ++i) {
                if(i == arr.length - 1)
                    sb.append(arr[i]);
                else
                    sb.append(arr[i] + " ");
            }

            answer.add(sb.toString());

            return;
        }

        for(int i = 0; i < N; ++i){

            if(visit[i] == false){
                arr[depth] = arrInput.get(i);
                visit[i] = true;
                dfs(depth+1, arrInput, visit);
                visit[i] = false;
            }
        }
    }
}
profile
게임개발자 백엔드개발자

0개의 댓글