https://www.acmicpc.net/problem/15650
15650번: N과 M (2)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
백준 15650번 N과 M(2) 문제 링크입니다.
핵심
https://kimtaesoo99.tistory.com/17
[백준]15649번 N과 M(1) (java)
https://www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
kimtaesoo99.tistory.com
위의 문제를 변형한 것인데, N과 M(1) 문제의 경우에는 중복되지 않는 수열을 출력하는 것이고, (2)는 (1)의 문제를 변형한
오름차순 순열이다. 단순히 (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 boolean[] check;
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());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
arr = new int[M];
check = new boolean[N];
btm(N, M, 0);
System.out.println(sb);
}
public static void btm(int N, int M, int depth) {
if (depth == M) {
for (int i=0; i <arr.length; i++) {
for(int j=0; j<arr.length-1; j++) {
if(arr[j]>arr[j+1])return;
}
sb.append(arr[i]).append(' ');
}
sb.append('\n');
return;
}
for (int i = 0; i < N; i++) {
if (!check[i]) {
check[i] = true;
arr[depth] = i + 1;
btm(N, M, depth + 1);
check[i] = false;
}
}
}
}
해설
우선 N과 M을 입력받고, int형 배열에는 M을 boolean형 배열은 N만큼의 크기로 생성한다.
이후 btm을 호출시킨다.
배열에 i+1 값을 넣는데, 만약 check 되지 않았다면(전에 사용) 사용함으로 바꾼다.
이후 재귀 호출을 하는데, depth의 값을 1 더하고 호출한다.
반복 후, depth의 값이 M과 같아지면, sb에 추가하는 작업을 해야 하는데,
여기서 N과 M(1)과 다른 차이점이 발생한다.
현재의 배열 값이 다음 배열 값보다 크면, 리턴 시킨다. 즉 sb에 그 배열은 추가되지 않는다.
이러한 과정을 반복하게 된다면, 오름차순의 순열만 sb에 추가된다.
개선점이나 오류가 있다면, 댓글 부탁드립니다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준]1620번 나는야 포켓몬 마스터 이다솜(java) (0) | 2022.07.18 |
---|---|
[백준]2004번 조합0의 개수(java) (0) | 2022.07.17 |
[백준]15649번 N과 M(1) (java) (0) | 2022.07.15 |
[백준]1002번 터렛(java) (0) | 2022.07.13 |
[백준]2477번 참외밭(java) (0) | 2022.07.13 |