알고리즘/백준저지

백준저지 15656번 N과 M (7)

anott 2021. 8. 28. 23:12

출처: https://www.acmicpc.net/problem/15656

 

15656번: N과 M (7)

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

www.acmicpc.net

 

제출 날짜: 2021년 8월 28일 토요일

 

 

 

생각

백준저지 N과 M 시리즈 중 3번(https://www.acmicpc.net/problem/15651)과 거의 동일한 문제다. 그냥 Scanner와 System.out.println()을 사용했더니 시간 초과가 나서 BufferedReader, BufferedWriter, StringTokenizer, StringBuilder를 몽땅 사용해서 통과했다. BufferedWriter는 static 전역변수로 선언해도 되는 건 알았는데 사용은 처음 해봤다.

그런데 검색(https://stackoverflow.com/questions/22148487/using-a-bufferedwriter-in-a-static-class, https://stackoverflow.com/questions/28003137/declaring-a-static-filewriter-and-filereader)해보니 선언은 static으로 하되 생성은 사용할 때 하는 게 나은 것 같다.

 

 

 

코드

// 출처: 백준저지 15656번 N과 M (7) https://www.acmicpc.net/problem/15656

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BOJ15656 {
    static int N, M;
    static int[] input, nums;
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        input = new int[N];
        nums = new int[N];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            input[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(input);
        getNum(0);

        bw.flush();
        bw.close();
    }

    private static void getNum(int cnt) throws IOException {
        if (cnt == M) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < M; i++) {
                sb.append(nums[i] + " ");
            }
            bw.write(sb + "\n");
            return;
        }

        for (int i = 0; i < N; i++) {
            nums[cnt] = input[i];
            getNum(cnt + 1);
        }
    }
}