관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[알고리즘] 백준 15663 N과 M (9) -백트랙킹- 자바 코틀린 본문

알고리즘/DFS, BFS, 시뮬, 백트래킹

[알고리즘] 백준 15663 N과 M (9) -백트랙킹- 자바 코틀린

막무가내막내 2021. 4. 5. 21:07
728x90

 

 

www.acmicpc.net/problem/15663

 

15663번: N과 M (9)

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

www.acmicpc.net

 

 

백트랙킹 시리즈문제 중 하나인 백준 15663 N과 M (9)를 풀었습니다.

 

오름차순으로 숫자들을 나열하되 중복된 숫자는 두 번 출력하면 안되었습니다.

그래서 오름차순으로 정렬하고 set을 이용해 중복된 숫자는 안나오게 백트랙킹을 구현했습니다.

 

풀이는 다음과 같습니다.

 

[Java]

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;

class Main {
    private static int N;
    private static int M;
    private static int[] nums;
    private static int[] arr;
    private static boolean[] isVisited;
    private static HashSet<String> set = new HashSet<>();
    private static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        M = sc.nextInt();
        nums = new int[N];
        arr = new int[M];
        isVisited = new boolean[N];
        for (int i = 0; i < N; i++) {
            nums[i] = sc.nextInt();
        }
        Arrays.sort(nums);
        dfs(0);
        System.out.println(sb.toString());
    }

    private static void dfs(int depth) {
        if (depth == M) {
            StringBuilder sb2 = new StringBuilder();
            for (int i = 0; i < M; i++) {
                sb2.append(arr[i]).append(" ");
            }
            if (!set.contains(sb2.toString())) { // 중복제거
                sb.append(sb2.toString()).append("\n");
                set.add(sb2.toString());
            }
            return;
        }
        for (int i = 0; i < N; i++) {
            if (!isVisited[i]) {
                isVisited[i] = true;
                arr[depth] = nums[i];
                dfs(depth + 1);
                isVisited[i] = false;
            }
        }

    }

}

 

 

 

[Kotlin]

import java.util.*


private var N = 0
private var M = 0
private lateinit var nums: IntArray
private lateinit var arr: IntArray
private lateinit var isVisited: BooleanArray
private val set = HashSet<String>()
private val sb = StringBuilder()

fun main(args: Array<String>) {
    val sc = Scanner(System.`in`)
    N = sc.nextInt()
    M = sc.nextInt()
    nums = IntArray(N)
    arr = IntArray(M)
    isVisited = BooleanArray(N)
    for (i in 0 until N) {
        nums[i] = sc.nextInt()
    }
    Arrays.sort(nums)
    dfs(0)
    println(sb.toString())
}

private fun dfs(depth: Int) {
    if (depth == M) {
        val sb2 = StringBuilder()
        for (i in 0 until M) {
            sb2.append(arr[i]).append(" ")
        }
        if (!set.contains(sb2.toString())) { // 중복제거
            sb.append(sb2.toString()).append("\n")
            set.add(sb2.toString())
        }
        return
    }
    for (i in 0 until N) {
        if (!isVisited[i]) {
            isVisited[i] = true
            arr[depth] = nums[i]
            dfs(depth + 1)
            isVisited[i] = false
        }
    }
}

 

댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!

728x90
Comments