백준 자바 15650 N과 M(2)

김재동·2024년 7월 9일
0

문제

목록 보기
5/16


우선 이 문제는 제목에서도 알 수 있다싶이 이전 문제와 흡사하다.
다만 수열을 배열에 담을 때, 오름차순으로 점차 증가하게끔 넣어야 하기에 해당 제어문을 고려해주었다.

package test11;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Ox11_Q4_2 {
	static StringBuilder sb;
	static int n,m;
	static int cnt;
	static boolean [] issued ;
	static int [ ] put;
	
	// 백준 15650 S3 ( N과 M(2) )
	public static void main(String args []) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		sb = new StringBuilder();
		
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		issued = new boolean[n+1];
		put = new int[m+1];
		br.close();
		
		checkN(0,1);
		System.out.println(sb.toString());
		
	}

	public static void checkN(int cur, int start) {
		// 현재 값(cur)과 원하는 개수(m)가 같으면 출력
		if (cur == m) {
			for (int i = 0; i < m; i++) {
				sb.append(put[i] + " ");
			}
			sb.append("\n");
			return;
		} // if fin
		
		// i가 start부터 시작하므로, 이후에 추가될 값은 오름차순임.
		for (int i = start; i <= n; i++) {
			if (!issued[i]) {
				put[cur] = i;
				issued[i] = true;
				// 재귀해서 체크
				checkN(cur + 1, i+1);
				// 초기화
				issued[i] = false;
			}// if fin
		} // for fin
	}// checkN fin

}

전체적으로 checkN 함수는 이전과 흡사하지만, 이번엔 증가하는 값들을 체크하기 위해
start라는 인자를 추가적으로 받아주었다.
그리고, 이전엔 반복하여 재귀문을 시행할 때, i = 0부터 시작했으나, 이번엔 i = start 부터 시작하였고,
바로 issued로 값의 여부를 체크해주므로 원하던 증가하는 값들만 구할 수 있었다.
마찬가지로 한 사이클을 돌리고 나선 isuued[i]를 초기화 시켜주면서 정상적으로 해결하였다.

굿

profile
성장중

0개의 댓글