본문 바로가기
프로그래밍/백준 문제 풀이(자바)

백준 15651번 자바 문제 답/해설(N과 M (3) 문제)

by 리드민 2022. 2. 8.
반응형

[1] 백준 카테고리
단계별로 풀어보기
백트래킹

3단계 N과 M (3)

 

 

[2] 문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
같은 수를 여러 번 골라도 된다.

1. 입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 7)

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

3. 예제 입력 1
3 1

4. 예제 출력 1
1

2

3

 

5. 예제 입력 2

4 2

 

6. 예제 출력 2

1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
3 1
3 2
3 3
3 4
4 1
4 2
4 3
4 4


[3] 정답
1. 정답 해설 미포함

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

public class Main {

	public static int[] arr;
	public static int a, b;
	public static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

 		a = Integer.parseInt(st.nextToken());
		b = Integer.parseInt(st.nextToken());

 		arr = new int[b];
		bta(0);
		System.out.println(sb);
	}

	public static void bta(int depth) {

 		if (depth == b) {
			for (int i = 0; i < b; i++) {
				sb.append(arr[i]).append(' ');
			}

			sb.append('\n');
			return;
		}

		for (int i = 1; i <= a; i++) {
			arr[depth] = i;
			bta(depth + 1);
		}

	}
}

 

2. 정답 해설 포함

import java.io.BufferedReader;
// java.io.BufferedReader class를 import 한다.
import java.io.InputStreamReader;
// java.io.InputStreamReader class를 import 한다.
import java.io.IOException;
// java.io.IOException class를 import 한다.
import java.util.StringTokenizer;
// java.util.StringTokenizer class를 import 한다.

public class Main {
// 접근제어자 public으로 Main class를 선언한다.

	public static int[] arr;
	// 접근제어자 public으로 메모리에 상주하게 int형 배열을 선언한다.
	public static int a, b;
	// 접근제어자 public으로 메모리에 상주하게 int형 변수 a, b를 선언한다.
	public static StringBuilder sb = new StringBuilder();
	// 접근제어자 public으로 메모리에 상주하게 StringBuilder 객체 sb를 선언한다.

	public static void main(String[] args) throws IOException {
	// 접근제어자 public으로 메모리에 상주하게 리턴값이 없이 main 함수를 선언한다.

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// BufferedReader 객체 br를 선언한다.
		StringTokenizer st = new StringTokenizer(br.readLine());
		// StringTokenizer 객체 st를 선언한다.

 		a = Integer.parseInt(st.nextToken());
		// 개행으로 값을 입력받아 변수 a에 저장한다.
		b = Integer.parseInt(st.nextToken());
		// 개행으로 값을 입력받아 변수 b에 저장한다.

 		arr = new int[b];
		// 배열 arr의 길이를 b로 한다.
		bta(0);
		// 메소드 bta를 매개변수 0으로 호출한다.
		System.out.println(sb);
		// sb를 출력한다.
	}

	public static void bta(int depth) {
	/* 접근제어자 public으로 메모리에 상주하게 메소드 bta를 선언한다.
	매개변수는 int depth로 한다. */

 		if (depth == b) {
		// if문을 선언한다. depth == b 일때 괄호안의 문장이 실행된다.
			for (int i = 0; i < b; i++) {
			// for문을 선언한다. i가 0~<b까지 괄호안의 문장이 반복된다.
				sb.append(arr[i]).append(' ');
				// 객체 sb에 arr[i]값과 공백 데이터를 추가한다.
			}

			sb.append('\n');
			// 객체 sb에 개행 데이터를 추가한다.
			return;
			// 메소드를 종료한다.
		}

		for (int i = 1; i <= a; i++) {
		// for문을 선언한다. i가 1~a까지 반복된다.
			arr[depth] = i;
			// arr[depth]에 i값을 저장한다.
			bta(depth + 1);
			// 메소드 bta(depth+1)를 호출한다.
		}

	}
}
반응형