[백준/자바] 15663번: N과 M (9)

수박강아지·2025년 9월 13일

BAEKJOON

목록 보기
124/174

문제

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

풀이

  • N개의 자연수 중에서 M개를 고른 수열
  • 오름차순
  • 중복되는 수열은 출력하면 안 됨

중복되는 값이 존재하는 N개의 자연수 중에서 순열을 뽑아내는 문제입니다.

		st = new StringTokenizer(br.readLine());
		nums = new int[n];
		for (int i = 0; i < n; i++) nums[i] = Integer.parseInt(st.nextToken());
		Arrays.sort(nums);
  • 오름차순으로 출력해야 되기 때문에, 입력 받을 때 정렬을 해줬습니다.
	private static void dfs(int idx) {
		
		if (idx == m) {
			for (int i : li) sb.append(i).append(" ");
			sb.append("\n");
			return;
		}
		
		int prev = 0; // 동일 레벨에서 중복값을 판단하는 변수
		for (int i = 0; i < n; i++) {
			if (!visited[i] && nums[i] != prev) { // 같은 값을 넣으려고 하면 안 됨
				visited[i] = true; // 방문 처리
				li[idx] = nums[i];
				prev = nums[i]; // 값 할당
				dfs(idx + 1); // 재귀
				visited[i] = false; // 백트래킹
			}
		}
	}
  • 중복되는 순열을 어떻게 제거를 할까 생각을 하다가 같은 레벨대에서 같은 수가 들어가지 않으면 괜찮을 거 같다 생각을 했습니다.
  • 그래서 메서드 안에 중복을 판별한 변수를 선언했습니다.

코드

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

public class Main_15663 {
	static StringBuilder sb = new StringBuilder();
	static int n, m;
	static int[] li, nums;
	static boolean[] visited;
	
	private static void dfs(int idx) {
		
		if (idx == m) {
			for (int i : li) sb.append(i).append(" ");
			sb.append("\n");
			return;
		}
		
		int prev = 0;
		for (int i = 0; i < n; i++) {
			if (!visited[i] && nums[i] != prev) {
				visited[i] = true;
				li[idx] = nums[i];
				prev = nums[i];
				dfs(idx + 1);
				visited[i] = false;
			}
		}
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		
		st = new StringTokenizer(br.readLine());
		nums = new int[n];
		for (int i = 0; i < n; i++) nums[i] = Integer.parseInt(st.nextToken());
		Arrays.sort(nums);
		
		li = new int[m];
		visited = new boolean[n];
		
		dfs(0);
		
		System.out.println(sb.toString());
	}

}

0개의 댓글