알고리즘

[백준, 자바, 15649번] N과 M (1)

hminor 2024. 9. 5. 17:09

풀이

  • 두 가지 해결 방법은 딱 2~3줄 차이로
  • StringBuilder로 결과를 String 타입으로 저장하는 건데
  • 나는 기존엔 첫 번째 해결 방법으로 join으로 배열을 공백없이 출력하도록 했는데
  • 이유는 계속 변수 + " " 이렇게 하면 마지막 인덱스의 값 다음에 
  • 공백이 추가되니까 문제가 될 거 같아 join으로 했는데 
  • 두 번째 방법처럼 StringBuilder에 추가 후 sb.toString() 을 해도 아무런 문제가 없어서.
  • 앞으로도 이렇게 하면 될 듯하다 ㅋㅋ

 

// 첫 번째 해결 방법

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

public class _15649 {
    static Deque<Integer> result;
    static boolean[] visit;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] NM = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int N = NM[0];
        int M = NM[1];
        result = new ArrayDeque<>();
        visit = new boolean[N + 1];
        int[] num_li = IntStream.rangeClosed(1, N).toArray();
        back(M, num_li);
        System.out.println(sb.toString());
    }

    public static void back(int M, int[] num_li) {
        if (result.size() == M) {
            for (int num: result) sb.append(num).append(" ");
            sb.append("\n");
            return;
        }

        for (int num : num_li) {
            if (!visit[num]) {
                result.add(num);
                visit[num] = true;
                back(M, num_li);
                result.pollLast();
                visit[num] = false;
            }
        }
    }
}

 

 

// 두 번째 해결 방법

import java.io.*;
import java.util.*;
import java.util.stream.*;
public class Main {
    static Deque<Integer> result;
    static boolean[] visit;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] NM = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int N = NM[0];
        int M = NM[1];
        result = new ArrayDeque<>();
        visit = new boolean[N+1];
        int[] num_li = IntStream.rangeClosed(1,N).toArray();
        back(M,num_li);

    }
    public static void back(int M, int[] num_li) {
        if (result.size() == M) {
            System.out.println(result.stream().map(String::valueOf).collect(Collectors.joining(" ")));
            return ;
        }
        for (int num: num_li) {
            if (!visit[num]) {
                result.add(num);
                visit[num] = true;
                back(M,num_li);
                result.pollLast();
                visit[num] = false;
            }
        }
    }
}