본문 바로가기

코딩테스트/JAVA

[백준 JAVA] 15665번: N과 M (11) - 중복 입력 값 중복 순열

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

 

-옆에 쓴거는 실제 문제 이름이 아니고 내가 알아보기 쉽게 하기 위해서 부재처럼 달아둔 것이다. 이번에는 좀 괴랄해졌다.

 

비슷한 바리에이션으로 가는 것 같다. 12까지 순열 조합이 왔다갔다하면서 입력값을 주고 안주고의 차이를 보여주고 중복된 값을 허용할 것인지 중복된 입력을 허용할 것인지 물어본다. 

 

이 문제에서는 (9) 중복 입력 값 순열에서 같은 수를 여러번 골라도 되는 순열이다. 그렇다고 해서

9 9

9 9 이런식으로 완전히 같은 값을 나오게 하면 안된다.

 

7 7  이런식으로 앞에 항목에 넣었던 값을 다시 가져도 된다는 말이다.

 

visit를 생략해보자.

 

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

public class Main {
	public static int n, m;
	public static int[] a;
	public static int[] arr;
	public static boolean[] visit;
	public static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		n = sc.nextInt();
		m = sc.nextInt();

		a = new int[n];
		arr = new int[m];
		visit = new boolean[n];

		for (int i = 0; i < n; i++) {
			a[i] = sc.nextInt();
		}

		Arrays.sort(a);

		dfs(0);
		System.out.println(sb);

	}

	public static void dfs(int depth) {
		if (depth == m) {
			for (int val : arr) {
				sb.append(val + " ");
			}
			sb.append('\n');
			return;
		}
		int before = 0;
		for (int i = 0; i < n; i++) {
//			if (!visit[i]) {
				if (before != a[i]) {
					before = a[i];
//					visit[i] = true;
					arr[depth] = a[i];
					dfs(depth + 1);
//					visit[i] = false;
//				}
			}
		}
	}
}

 

답이 맞았다.