본문 바로가기

알고리즘/🥈 실버

백준 15656 N과 M (7) 자바 풀이

728x90

난이도 : 실버3

풀이일 : 240229

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

 

15656번: N과 M (7)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열

www.acmicpc.net


링크로 이동하기 귀찮은 분들을 위한 문제 캡쳐


풀이 코드

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

public class Main {
	static int N, M;
	static int[] nums;
	static int[] result;
	static StringBuilder sb = new StringBuilder();
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		// 초기 설정
		N = sc.nextInt();
		M = sc.nextInt();
		nums = new int[N];
		result = new int[M];
		
		// 입력받기
		for (int i = 0; i < N; i++) {
			nums[i] = sc.nextInt();
		}
		
		// 배열 정렬
		Arrays.sort(nums);
		
		DFS(0);
		System.out.println(sb);
	};
	
	static void DFS(int depth) {
		// 깊이가 M인 경우, 현재 result 요소들을 sb에 추가
		if (depth == M) {
			for (int i : result) {
				sb.append(i+" ");
			}
			sb.append('\n');
			return;
		}
		// 그렇지 않으면 재귀호출로 다음 숫자 추가
		for (int i = 0; i < N; i++) {
			result[depth] = nums[i];
			DFS(depth+1);
		}
	}
}
  • Arrays.sort() : 수열을 사전 순서로 출력하기 위한 정렬 과정
  • 중복된 숫자를 출력해야 하기 때문에 visited 배열 미생성
  • 현재 깊이가 M과 같으면, result 요소들 sb에 추가, 아니라면 재귀호출

느낀점

  • 2월 1일에 마지막으로 자바 문제를 풀고 처음 풀어서 하는 기록
  • N과 M 시리즈를 여행 중 다 풀고 올 것 같았는데 그러지 못했다. 그래도 많이 풀었어서 그런지 기억이 나서 쉽게 풀었다. Arrays.sort 같은건 조금 버벅였지만