[백준/자바] 15656번: N과 M (7)

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

BAEKJOON

목록 보기
122/174

문제

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

풀이

  • N개의 자연수 중에서 M개를 고른 수열
  • 같은 수를 여러 번 골라도 된다.

중복 순열을 구하는 문제

15651번: N과 M (3)은 1부터 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) { // m개를 골랐다면 출력
			for (int i : li) sb.append(i).append(" ");
			sb.append("\n");
			return;
		}
		
        // 모든 수 담기
		for (int i = 0; i < n; i++) {
			li[idx] = nums[i];
			dfs(idx + 1); // 재귀
		}
	}
  • 중복값도 존재하며 모든 값을 갖고 순열을 만들어야 하기 때문에 visited 배열은 필요 없습니다.

코드

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

public class Main_15656 {
	static StringBuilder sb = new StringBuilder();
	static int n, m;
	static int[] li, nums;
	
	private static void dfs(int idx) {
		
		if (idx == m) {
			for (int i : li) sb.append(i).append(" ");
			sb.append("\n");
			return;
		}
		
		for (int i = 0; i < n; i++) {
			li[idx] = nums[i];
			dfs(idx + 1);
		}
	}
	
	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];
		dfs(0);
		
		System.out.println(sb.toString());
	}

}

0개의 댓글