일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 백준
- Spotify Api
- SECS
- c
- CS
- C++
- Spring
- java
- 회원가입
- SWEA
- MYSQL
- spring boot
- modern c++
- 프로그래머스
- 파이썬
- linux
- SECS/GEM
- programmers
- SECS-II
- Gem
- SW Expert Academy
- Spring JPA
- Computer Science
- 스포티파이
- regression
- 회귀
- spotify
- 자바
- Baekjoon
- python
Archives
- Today
- Total
비버놀로지
[BAEKJOON 백준] 9742 순열 본문
728x90
문제
집합의 순열이란 집합의 서로 다른 원소를 모두 사용해 만들 수 있는 순서이다. 예를 들어, {2,3,5}의 순열은 다음과 같다.
- 2 3 5
- 2 5 3
- 3 2 5
- 3 5 2
- 5 2 3
- 5 3 2
각각의 순열은 숫자로 나타낼 수 있다. 위의 순열은 사전순으로 쓰여져 있으며, 등장하는 순서를 이용해 나타낸다. 즉, 3 5 2는 위치 4에 있고, 5 3 2는 마지막 위치인 6에 있다.
{b,e,i,n}으로 만들 수 있는 순열은 다음과 같다.
- b e i n
- b e n i
- b i e n
- b i n e
- b n e i
- b n i e
- e b i n
- e b n i
- e i b n
- e i n b
- e n b i
- e n i b
- i b e n
- i b n e
- i e b n
- i e n b
- i n b e
- i n e b
- n b e i
- n b i e
- n e b i
- n e i b
- n i b e
- n i e b
서로 다른 숫자와 문자로 이루어진 집합과 위치가 주어졌을 때, 그 집합의 순열 중 주어진 위치의 순열을 구하는 프로그램을 작성하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 문자열은 서로 다른 숫자와 알파벳으로 이루어져 있으며, 길이는 최대 10이다. 또한, 사전순 순서대로 주어진다. 문자열 다음에는 찾아야 하는 위치가 주어지며, 이 값은 3,628,800보다 작거나 같은 자연수이다.
출력
각각의 테스트 케이스마다, 입력으로 주어진 위치에 해당하는 순열을 공백없이 출력한다. 만약, 해당하는 순열이 없는 경우에는 "No permutation"을 출력한다.
순열을 구하는 문제이다.
순열을 구하기 위해서는 DFS 방식으로 문제를 풀어야 한다.
순열의 경우 중복이 있으면 안되기 때문에 visit배열을 이용을 해서 순열을 만들때 중복이 생기지 않도록 주의해야 한다.
그리고 순열이 없는 경우에는 No permutation을 출력하도록 했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static int N;
private static String arr[];
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=br.readLine())!=null) {
StringTokenizer st=new StringTokenizer(line," ");
String temp=st.nextToken();
arr=temp.split("");
time=0;
temparr=new String[arr.length];
visit=new boolean[arr.length];
N=Integer.parseInt(st.nextToken());
find(0);
System.out.print(temp+" "+N+" = ");
if(time<N) { //순열이 없을 경우
System.out.println("No permutation");
}else { //순열이 있을 경우
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[j]);
}
System.out.println();
}
}
}
private static String temparr[];
private static boolean visit[];
private static int time;
private static void find(int cnt) {
// TODO Auto-generated method stub
if(cnt==arr.length) { //순열이 만들어 졌을 경우
time++; //순열의 수를 세어준다.
if(time==N) { //해당 위치랑 같다면 결과 배열에 저장을 해준다.
for (int i = 0; i < arr.length; i++) {
arr[i]=temparr[i];
}
}
return;
}
for (int i = 0; i < arr.length; i++) { // 순열을 만들어 주는 작업이다.
if(visit[i])continue; //visit 배열이 true면 무시한다.
temparr[cnt]=arr[i]; //임시배열에 순열을 저장해 준다.
visit[i]=true;
find(cnt+1);
visit[i]=false;
}
}
}
728x90
'ALGORITM > JAVA' 카테고리의 다른 글
[BAEKJOON 백준] 10158 개미 (0) | 2021.03.01 |
---|---|
[BAEKJOON 백준] 10157 자리배정 (0) | 2021.03.01 |
[BAEKJOON 백준] 7576 토마토 (0) | 2021.03.01 |
[BAEKJOON 백준] 7562 나이트의 이동 (0) | 2021.03.01 |
[BAEKJOON 백준] 5585 거스름돈 (0) | 2021.03.01 |
Comments