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

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

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

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

4단계 N과 M (4)

 

 

[2] 문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
    1부터 N까지 자연수 중에서 M개를 고른 수열
    같은 수를 여러 번 골라도 된다.
    고른 수열은 비내림차순이어야 한다.
        길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.

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

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 a, b;
	public static int[] arr;
	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(1, 0);
		System.out.println(sb);
	}

	public static void bta(int at, int depth) {
		if (depth == b) {

			for (int val : arr) {
				sb.append(val).append(' ');
			}

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

		for (int i = at; i <= a; i++) {
			arr[depth] = i;
			bta(i, 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 a, b;
  // 접근제어자 public으로 메모리에 상주하게 int형 변수 a, b를 선언한다.
  public static int[] arr;
  // 접근제어자 public으로 메모리에 상주하게 int형 배열 arr를 선언한다.
  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(1, 0);
    // 함수 bta를 매개변수 1, 0으로 호출한다.
    System.out.println(sb);
    // 변수 sb를 출력한다.
  }

  public static void bta(int at, int depth) {
  // 접근제어자 public으로 메모리에 상주하게 리턴값이 없이 함수 bta를 선언한다.
    if (depth == b) {
    // if문을 선언한다. depth == b일때 괄호안의 문장이 실행된다.

      for (int val : arr) {
      // for문을 선언한다.
      sb.append(val).append(' ');
      // 객체 sb에 변수 val의 값과 공백을 추가한다.
      }

      sb.append('\n');
      // 객체 sb에 개행을 추가한다.
      return;
      // 함수 사용을 종료한다.
	  }

    for (int i = at; i <= a; i++) {
    // for문을 선언한다 i가 at~a일때 괄호안의 문장이 실행된다.
      arr[depth] = i;
      // 변수 arr[depth]에 변수 i의 값을 저정한다.
      
      bta(i, depth + 1);
      // bta(i, depth+1)를 호출한다. 재귀함수가 된다.
      
    }
  }

}
반응형