ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Q. 15654 자바 : N과M(5)
    코딩테스트/백준_Java 2023. 4. 24. 22:59

    Q. 15654 자바 : N과M(5)

     

    문제 : boj.kr/15654

    실버 3 난이도의 문제이다.

     

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

    N개의 자연수는 모두 다른 수이다.

    - N개의 자연수 중에서 M개를 고른 수열을 출력하는 문제이다. 

    주의해야 할 점은 수열은 사전 순으로 증가하는 순서로 출력한다 라는 내용 때문에 수열을 입력 받은 뒤 정렬이 한번 필요하다.

     

    이 문제는 백트래킹과 재귀함수를 이용해 풀었고, 

    이전 계산한 결과를 배열에 저장하고, 깊이가 최대일 때 까지 탐색을 완료하면 저장한 결과를 출력하는 방식으로 풀었다.

     

    시간 복잡도를 계산하면, M과 N이 최대 8이므로 

    1. 계산 - O(N^M)

    2. 출력 - O(NM)

    두 계산은 연관이 없으므로 곱해줄 필요는 없으므로 약O(N^M)의 시간복잡도를 가진다.

    8^8 = 16,777,216으로 시간초과는 걱정하지 않아도 된다.

    자료형은 백트래킹한 수열 저장은 int형 배열에, 중복 여부 확인은 HashSet을 이용했다. 역시 int 범위 내에서 모두 해결할 수 있다.

     

    풀이는 아래와 같다.

    import java.io.*;
    import java.util.Arrays;
    import java.util.HashSet;
    import java.util.StringTokenizer;
    
    public class Main {
        static FastReader scan = new FastReader();
        static StringBuilder sb = new StringBuilder();
    
        static int N, M;
        static int[] input_val;
        static HashSet<Integer> hashSet;
        static int[] prev_val;
    
        static void input() {
    
            N = scan.nextInt();
            M = scan.nextInt();
            hashSet = new HashSet<>();
            input_val = new int[N];
            prev_val = new int[M];
            for (int i = 0; i < N; i++) input_val[i] = scan.nextInt();
        }
    
        static void pro() {
            Arrays.sort(input_val);
            recur_func(0);
            System.out.println(sb);
        }
    
        static void recur_func(int depth) {
            if (depth == M) {
                for (int i = 0; i < M; i++) {
                    sb.append(prev_val[i]).append(' ');
                }
                sb.append('\n');
            }else {
                for (int i = 0; i < N; i++){
                    if(hashSet.add(input_val[i])) {
                        prev_val[hashSet.size() - 1] = input_val[i];
                        recur_func(depth + 1);
                        hashSet.remove(input_val[i]);
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            input();
            pro();
        }
    
    
        static class FastReader {
            BufferedReader br;
            StringTokenizer st;
    
            public FastReader() {
                br = new BufferedReader(new InputStreamReader(System.in));
            }
    
            public FastReader(String s) throws FileNotFoundException {
                br = new BufferedReader(new FileReader(new File(s)));
            }
    
            String next() {
                while (st == null || !st.hasMoreElements()) {
                    try {
                        st = new StringTokenizer(br.readLine());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                return st.nextToken();
            }
    
            int nextInt() {
                return Integer.parseInt(next());
            }
    
            long nextLong() {
                return Long.parseLong(next());
            }
    
            double nextDouble() {
                return Double.parseDouble(next());
            }
    
            String nextLine() {
                String str = "";
                try {
                    str = br.readLine();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return str;
            }
        }
    }
    반응형

    '코딩테스트 > 백준_Java' 카테고리의 다른 글

    Q. 25758 자바 : 유전자 조합  (0) 2023.08.16
    Q. 15657 자바 : N과 M(8)  (2) 2023.04.25
    Q. 14940 자바 : 쉬운 최단거리  (0) 2023.04.22
    Q. 4179 자바 : 불!  (0) 2023.04.21
    Q. 2660 자바 : 회장 뽑기  (0) 2023.04.20

    댓글

Designed by Tistory.