Algorithm/백준 자바

백준 15651 자바 (N과 M(3))

눈오는1월 2024. 4. 22. 20:04
728x90

<코드>

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

 

15651번: N과 M (3)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

<풀이>

1. 어떤 접근으로 문제를 접근하려고 했는지

    중복순열의 모든 경우의 수를 출력하는 문제이다.

    다른 N과 M 문제와 다르게 단순하게 그냥 재귀함수로 숫자를 넣고 재귀함수가 끝날 때 숫자를 제거하면 되는 문제이다.

    

2. 문제를 해결하기 위한 기능

    중복순열 구하는 기능

    선택한 숫자 출력기능

 

<코드>

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

public class Main {

    public static int n, m;
    public static ArrayList<Integer> arrayList = new ArrayList<>();
    public static StringBuilder sb = new StringBuilder();

    public static void print() {
        for(int i = 0; i < arrayList.size(); i++) {
            sb.append(arrayList.get(i)).append(" ");
        }
        sb.append("\n");
    }
    public static void dfs(int h) {
        if(h == m + 1) {
            print();
            return;
        }
        for(int i = 1; i <= n; i++) {
            arrayList.add(i);
            dfs(h + 1);
            arrayList.remove(arrayList.size() - 1);
        }

    }

    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());

        dfs(1);

        System.out.println(sb);

    }
}

 

 

<후기>

System.out.println()으로 출력할 경우 타임아웃이 발생했다. 아무래도 문자열을 많이 더할수록 System.out.println()의 속도가 느리기 때문이라고 생각했고 앞으로는 StringBuilder를 적극적으로 사용해야겠다는 생각을 했다.

728x90