백준

[JAVA] 15663 N과 M - 백준

development study 2022. 2. 27. 15:56

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

 

15663번: N과 M (9)

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

www.acmicpc.net


문제풀이

1. 증가하는 순서로 출력하기 위해 입력 받은 수 정렬

2. 백트래킹을 사용해 순열 생성

3. 중복 방지, 입력 순서를 유지하기 위해 LinkedHashSet에 저장

 

import java.util.*;

public class Main {
	static int N,M;
	static int[] arr;
	static LinkedHashSet<String> hs = new LinkedHashSet<>();
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		N = sc.nextInt();
		M = sc.nextInt();
		arr = new int[N];
		
		for(int i=0; i<N; i++) {
			arr[i] = sc.nextInt();
		}
		
		// 증가하는 순서로 출력하기 위해 수 정렬
		Arrays.sort(arr);
		
		// 백트래킹을 사용한 순열 생성
		permu(0,new int[M], new boolean[N]);
		
		// Iterator를 사용해 LinkedHashSet 출력
		Iterator iter = hs.iterator();
		while(iter.hasNext()) {
			System.out.println(iter.next());
		}
	}

	private static void permu(int idx, int[] value, boolean[] visit) {
		// idx == M 이면 순열 완성(기저조건)
		if(idx==M) {
			String str = "";
			for(int i=0; i<idx; i++) {
				str += Integer.toString(value[i]) + " ";
			}
			// 중복 방지, 입력 순서 유지를 위해 LinkedHashSet에 저장
			hs.add(str);
			return;
		}
		
		for(int i=0; i<N; i++) {
			if(!visit[i]) {
				visit[i] = true;
				value[idx] = arr[i];
				permu(idx+1, value, visit);
				visit[i] = false;
			}
		}
	}

}
반응형