티스토리 뷰
728x90
:D 문제
문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
Baekjoon
:D 풀이 방법
나는 아래 코드와 같이 perm()을 구현하여 해결하였다.
cnt == M이 될 때까지 1부터 N까지 반복하며, 이미 방문된 경우는 continue로 처리하였다.
:D 작성 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution15649H {
static int N, M;
static int[] combinedNums;
static boolean[] isSelected;
static StringBuilder answer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
answer = new StringBuilder();
String input = br.readLine();
StringTokenizer tokenizer = new StringTokenizer(input, " ");
N = Integer.parseInt(tokenizer.nextToken());
M = Integer.parseInt(tokenizer.nextToken()); // R
combinedNums = new int[M];
isSelected = new boolean[N + 1];
perm(0);
System.out.print(answer);
}
// 순열
private static void perm(int cnt) {
if (cnt == M) {
printNums(combinedNums);
return;
}
for (int i = 1; i <= N; i++) {
if(isSelected[i]) continue;
combinedNums[cnt] = i;
isSelected[i] = true;
perm(cnt + 1);
isSelected[i] = false;
}
}
// 출력
private static void printNums(int[] nums){
for(int num : nums){
answer.append(num + " ");
}
answer.append("\n");
}
}
728x90
'ALGORITHM > BAEKJOON' 카테고리의 다른 글
[BAEKJOON] 15900. 나무 탈출(JAVA) (0) | 2022.08.25 |
---|---|
[BAEKJOON] 10026. 적록색약(JAVA) (0) | 2022.08.24 |
[BAEKJOON] 1759. 암호 만들기(JAVA) (0) | 2022.08.22 |
[BAEKJOON] 14503. 로봇 청소기(JAVA) (0) | 2022.08.20 |
[BAEKJOON] 11729. 하노이 탑 이동 순서(JAVA) (0) | 2022.08.17 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크