문제
N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 N(1 ≤ N ≤ 8)이 주어진다.
출력
첫째 줄부터 N!개의 줄에 걸쳐서 모든 순열을 사전순으로 출력한다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static int N;
static int[] src, tgt;
static boolean[] select;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
tgt = new int[N];
src = new int[N];
select = new boolean[N];
for (int i = 0; i < N; i++) {
src[i] = i;
}
perm(0);
}
static void perm(int tgtIdx) {
if (tgtIdx == N) {
for (int i = 0; i < N; i++) {
System.out.print((tgt[i] + 1) + " ");
}
System.out.println();
return;
}
for (int i = 0; i < N; i++) {
if (select[i])
continue;
tgt[tgtIdx] = src[i];
select[i] = true;
perm(tgtIdx + 1);
select[i] = false;
}
}
}
풀이
select를 이용한 순열 알고리즘이다.
select를 이용해서 tgt의 중복이 생기지 않도록 한다. (이미 뽑은 인덱스는 다시 뽑지 않는다.)
( 이 문제와 별개로 중복을 허용하는 순열을 구할땐 select를 빼면 된다 ! )
오늘부터 순열 조합 문제 다 조지기.. 가보자고 ...~!
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1, 2, 3 더하기 (자바) (순열 알고리즘) (0) | 2022.08.17 |
---|---|
[백준] 1759번 암호 만들기 (자바) (조합 알고리즘) (0) | 2022.08.17 |
[백준] 1244번 스위치 켜고 끄기 (자바) (0) | 2022.08.04 |
[백준] 1074번 Z (파이썬) (4) | 2022.03.23 |
[백준] 1992번 쿼드트리 (파이썬) (0) | 2022.03.23 |