반응형
[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)를 호출한다.
}
}
}
반응형
'프로그래밍 > 백준 문제 풀이(자바)' 카테고리의 다른 글
백준 9663번 자바 문제 답/해설(N-Queen문제) (0) | 2022.02.10 |
---|---|
백준 15652번 자바 문제 답/해설(N과 M (4) 문제) (0) | 2022.02.09 |
백준 15650번 자바 문제 답/해설(N과 M (2) 문제) (0) | 2022.02.07 |
백준 15649번 자바 문제 답/해설(N과 M (1) 문제) (0) | 2022.01.23 |
백준 18870번 자바 문제 답/해설(좌표 압축 문제) (0) | 2022.01.22 |