swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWAe7XSKfUUDFAUw
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
순열 + Powerset문제
***주의할 점***
static 변수 참조에 의한 시간 초과를 조심해야하는 문제.
추 배열을 재귀함수의 인자로 넘겨주어야 함.
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Solution {
static int N,res;
public static void main(String[] args) throws FileNotFoundException {
//permutation을 넘겨줘야함. 인자(방문배열, idx, left무게,right무게)
System.setIn(new FileInputStream("input/준환이의양팔저울.txt"));
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int tc = 1; tc <= T; tc++) {
N =sc.nextInt();//추의 개수
int arr[] = new int[N];//추 배열
res=0;//경우의 수 count
for (int i = 0; i < N; i++) {
arr[i]=sc.nextInt();
}
perm(arr,new boolean[N],0,0,0);//재귀 시작
System.out.printf("#%d %d\n",tc, res);
}
}
/*
* 순열 + 파워셋.
*담을필요없고 오른쪽, 왼쪽 "값" 만 갖고있으면된다 ->int 선언해줌
*static을 쓰면 좀더느리다. 지역변수쓰기.
*/
private static void perm(int arr[],boolean v[],int k, int left, int right) {
if(left < right)return;//오른쪽 합이 왼쪽보다 더 큰경우 return ->가지치기
if(k==arr.length) {
res++;
return;
}
for (int i = 0; i < N; i++) {
if(v[i]) continue;
v[i]=true;
/*
* 부분집합의 개념 : 뽑고, 뽑지않고
*/
perm(arr, v,k+1, left, right+arr[i]);//오른쪽에 추가하는 경우
perm(arr, v,k+1, left+arr[i], right);//왼쪽에 추가하는 경우
v[i]=false;
}
}
}
'Problem Solving > SWEA' 카테고리의 다른 글
[SWEA]- 8382 방향 전환 (0) | 2021.03.15 |
---|---|
SWEA- 6808 규영이와 인영이의 카드게임 (0) | 2021.02.15 |
SWEA-1220 Magnetic (0) | 2021.02.13 |
SWEA- 9229 한빈이와 Spot Mart (0) | 2021.02.08 |
SWEA- 1233 계산기 2 (0) | 2021.02.07 |
댓글