티스토리 뷰
출처 : https://www.acmicpc.net/problem/18429
🔍Solve
순조부의 전형적인 순열 문제입니다.
순열은 서로 다른 n개 중 r개를 택하며, 순서를 고려합니다. 주의해야 할 점은 n이 12를 넘어가면서(12!) 시간 복잡도가 폭발적으로 증가합니다.
해당 문제는 n이 8까지이므로, 무리없이 돌릴 수 있었습니다.
운동 키트의 증량 증가량을 담은 배열을 선언하고 해당 배열을 순열 함수를 돌립니다.
permutation의 매개변수는 재귀를 돌리면서 현재까지 뽑은 순열의 개수를 나타내는 cnt, 뽑힌 순열의 값이 담겨있는 selected, 인덱스에 해당하는 숫자가 사용 중인지 관리하는 isSelected배열이 있습니다.
inductive part에서는 처음부터 키트배열의 길이만큼 탐색하며 배열의 모든 수를 현재 자리에 넣어봅니다.isSelected배열을 통해 기존 자리의 수들과 중복되는지 체크하고, 중복되지 않았다면 사용하고 다음 수를 뽑으러 갑니다. 마지막은 꼭 해당 자리를 false처리를 해주어야 합니다.
뽑힌 selected배열의 각 인덱스의 키트 운동량을 더해주고, K를 빼줍니다. 연산을 한 뒤의 값이 500보다 작으면 재귀를 빠져나옵니다.마지막 selected 인덱스까지 다 돌았다면 경우의 수를 1 증가시킵니다.
❗ Code
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
//순열, 완탐, 백트래킹
static int N; //운동 키트 개수
static int K; //몇일 동안?
static int[] kit; //운동 키트
static int count;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
kit = new int[N];
st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++){
kit[i] = Integer.parseInt(st.nextToken());
}
permutaion(0, new int[N], new boolean[N]);
System.out.println(count);
}
/**
*
* @param cnt 뽑은 개수
* @param selected 뽑은 int형 배열
* @param isSelected 각 자리가 뽑혔나 안뽑혔나 boolean배열
*/
private static void permutaion(int cnt, int[] selected, boolean[] isSelected){
//base part
if(cnt==N){
// System.out.println(Arrays.toString(selected));
int mus = 500;
for(int i=0;i<selected.length;i++){
mus += selected[i];
mus -= K;
if(mus<500){
return;
}
}
count++;
return;
}
//inductive part
for(int i=0;i<kit.length;i++){
if(isSelected[i]) continue;
selected[cnt] = kit[i];
isSelected[i] = true;
permutaion(cnt+1, selected, isSelected);
isSelected[i] = false;
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ] 백준 3190 뱀 (JAVA) (0) | 2022.04.07 |
---|---|
[BOJ] 백준 2636 치즈 (JAVA) (0) | 2022.03.30 |
[BOJ] 백준 9465 스티커 (JAVA) (0) | 2022.03.24 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준
- docker
- 알고리즘
- 조합
- 순열
- 운영체제
- 토큰기반인증
- EffectiveJava
- IMAGE
- dfs
- 아이템60
- subset
- 부분집합
- 정처기
- 아이템61
- OS
- Java
- 완탐
- 아이템59
- BFS
- bruteforce
- Container
- docker-compose
- Retrofit2
- 이펙티브자바
- 완전탐색
- BOJ
- springboot
- dp
- 그래프탐색
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함