BOJ 15649 ~ 15652

2020-08-05

위 문제는 백준 사이트의 알고리즘 15649-15652 문제에 관한 설명입니다.


BOJ 15649

N과 M (1) 문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열

입력

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

출력

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다.

중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

package day0805;

import java.util.Scanner;

public class Backjoon15649_BaekJunghyun {
	static int N, M;
	static boolean[] visited;
	static int[] array;

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		N = scanner.nextInt();
		M = scanner.nextInt();
		array = new int[M];
		visited = new boolean[N + 1];
		recur(0);
	}

	static void recur(int count) {
		if (count == M) {
			for (int i = 0; i < M; i++) {
				System.out.print(array[i]+" ");
			}
			System.out.println();
			return;
		}
		for (int i = 1; i <= N; i++)// 1~N 
		{
			if (visited[i] == true)
				continue;
			visited[i] = true;
			array[count]=i;
			recur(count + 1);
			visited[i] = false;
		}

	}
}

BOJ 15650

N과 M (2) 문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
  • 고른 수열은 오름차순이어야 한다.

입력

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

출력

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다.

중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

package day0805;

import java.util.Scanner;

public class Backjoon15650_BaekJunghyun {
	static int N, M;
	static boolean[] visited;
	static int[] array;

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		N = scanner.nextInt();
		M = scanner.nextInt();
		array = new int[M];
		visited = new boolean[N + 1];
		recur(1, 0);
	}

	static void recur(int current, int count) {
		if (count == M) {
			for (int i = 0; i < M; i++) {
				System.out.print(array[i] + " ");
			}
			System.out.println();
			return;
		}
		for (int i = current; i <= N; i++)// 1~N 
		{
			if (visited[i] == true)
				continue;
			visited[i] = true;
			array[count] = i;
			recur(i, count + 1);
			visited[i] = false;
		}

	}
}

BOJ 15651

N과 M (3) 문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 M개를 고른 수열
  • 같은 수를 여러 번 골라도 된다.

입력

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

출력

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다.

중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

package day0805;

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

import java.util.StringTokenizer;

public class Backjoon15651_BaekJunghyun {
	static int N, M;
	static int[] array;
	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());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		array = new int[M];
		recur(0);
		System.out.println(sb.toString());
	}

	static void recur(int count) {
		if (count == M) {
			for (int i = 0; i < M; i++) {
				sb.append(array[i] + " ");
			}
			sb.append("\n");
			return;
		}
		for (int i = 1; i <= N; i++)// 1~N 
		{
			array[count] = i;
			recur(count + 1);
		}

	}
}

BOJ 15652

N과 M (4) 문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 M개를 고른 수열
  • 같은 수를 여러 번 골라도 된다.
  • 고른 수열은 비내림차순이어야 한다.
  • 길이가 K인 수열 A가 A1 ≤ A2 ≤ … ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.

입력

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

출력

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다.

중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

package day0805;

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

public class Backjoon15652_BaekJunghyun {
	static int N, M;
	static int[] array;
	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());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		array = new int[M];
		recur(1, 0);
		System.out.println(sb.toString());
	}

	static void recur(int current, int count) {
		if (count == M) {
			for (int i = 0; i < M; i++) {
				sb.append(array[i] + " ");
			}
			sb.append("\n");
			return;
		}
		for (int i = current; i <= N; i++)// 1~N 
		{
			array[count] = i;
			recur(i, count + 1);
		}

	}
}

여태껏 StringBuilder를 이용해서 알고리즘을 풀었던 적은 없는데.

해당 문제들 중 System.out.println()을 사용한다면 여러번의 호출로 인해 시간 초과가 발생하게 됩니다.

그래서 해결책으로 StringBuilder의 사용법을 급하게 찾았습니다.

생각보다 쓰기도 쉬운편이었습니다.

N과 M(1)

N과 M(2)

N과 M(3)

N과 M(4)