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

Updated:

문제 URL

https://www.acmicpc.net/problem/15649 boj15649

내풀이

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

public class Main {
    private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        boolean[] ok = new boolean[n + 1];
        int[] ans = new int[m];
        cal(0, n, m, ok, ans);
        bw.flush();
        bw.close();
    }

    public static void cal(int idx, int n, int m, boolean[] ok, int[] ans) throws IOException {
        if (idx == m) {
            StringBuilder sb = new StringBuilder();
            for (int a : ans)
                sb.append(a + " ");
            bw.write(sb.toString());
            bw.newLine();
            return;
        }

        for (int i = 1; i <= n; i++) {
            if (ok[i])
                continue;
            ok[i] = true;
            ans[idx] = i;
            cal(idx + 1, n, m, ok, ans);
            ok[i] = false;
        }
    }
}

다른 풀이

import java.util.*;
public class Main {
    static boolean[] c = new boolean[10]; // 사용했으면 true, 안했으면 false
    static int[] a = new int[10]; // 결과
    static void go(int index, int n, int m) {
        if (index == m) {
            for (int i=0; i<m; i++) {
                System.out.print(a[i]);
                if (i != m-1) System.out.print(' ');
            }
            System.out.println();
            return;
        }
        for (int i=1; i<=n; i++) {
            if (c[i]) continue;
            c[i] = true;
            a[index] = i;
            go(index+1, n, m);
            c[i] = false; // 다시 원래상태로
        }
    }   
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        go(0,n,m);
    }
}

느낀점

전형적인 브루트포스다.

각각 순서에 어떤 수가 들어가는지 알아야 다음 수에 어떤 수를 넣는지 알수있다. 백준 강의에서 배운대로 순서관련 문제이다.

Leave a comment