알고리즘/BOJ

[JAVA][BOJ][S3] 10974. 모든 순열

토요일 2022. 6. 24. 00:41
728x90
 

10974번: 모든 순열

N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오.

www.acmicpc.net

문제

N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N(1 ≤ N ≤ 8)이 주어진다. 

출력

첫째 줄부터 N!개의 줄에 걸쳐서 모든 순열을 사전순으로 출력한다.

풀이

순열을 이용해서 풀 수 있는 기본 문제다

자세한 코드는 아래 링크에 정리해 두었다

 

순열, 조합, 부분집합

교육 초반에 쓰다가 한동안 보이지 않았었는데, dfs나 bfs와 결합된 알고리즘에서 많이 사용되어 잊어버리지 않기 위해 다시 정리하기로 했다 순열(Permutation = nPr) = n*n-1*n-2* ... * n-r+2 * n-r+1 = n부터.

read-me.tistory.com

 

코드

package 문제풀이;

import java.io.*;
import java.util.*;

public class S3_10974_모든순열 {
	static int N;
	static int[] input, numbers;
	static boolean[] isSelected;
	static StringBuilder sb;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		sb = new StringBuilder();
		
		N = Integer.parseInt(br.readLine());
		
		input = new int[N];
		numbers = new int[N];
		isSelected = new boolean[N];
		
		for (int i = 0; i < N; i++) {
			input[i] = i+1;
		}
		
		P(0);
		
		System.out.println(sb);

	}

	private static void P(int cnt) {
		if(cnt == N) {
			for (int i = 0; i < N; i++) {
				sb.append(numbers[i] + " ");
			}
			sb.append("\n");
			return;
		}
		
		for (int i = 0; i < N; i++) {
			if(isSelected[i]) continue;
			numbers[cnt] = input[i];
			isSelected[i] = true;
			P(cnt+1);
			isSelected[i] = false;
		}
		
	}

}

결과

 

#자바 #java #boj #백준 #알고리즘

728x90