BOJ 15649 ~ 15652
위 문제는 백준 사이트의 알고리즘 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의 사용법을 급하게 찾았습니다.
생각보다 쓰기도 쉬운편이었습니다.