https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWAe7XSKfUUDFAUw
1. 1,2,4 가 들어오면 순열을 만들어준다. ex)1,2,4 / 1,4,2 ......
2. 그 순열을 가지고 dfs를 돈다
3.dfs : (1,2,4)에 대해 왼쪽,오른쪽 분기로 dfs2개 돌린다.
3-1 : 이때 depth를 인덱스로 사용하라
3-2 : left<right -> 유망X -> return (가지치기)
3-3: depth==3 -> return, 더탐색X, 정답++
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Solution_3234_유동훈 {
static int answer;
static int N;
static boolean[] visit;
static int[] result;
static int[] arr;
/*
* 왼무게, 오른무게
* 정답 경우의 수
*/
static void comb(int depth)
{
if(depth==N)
{
//System.out.println(Arrays.toString(result));
//return result;
dfs(0,0,0,result);
return;
}
for(int i=0;i<N;++i)
{
if(!visit[i])
{
result[depth]=arr[i]; //depth를 인덱스로 써라
visit[i]=true;
comb(depth+1);
visit[i]=false;
}
}
}
/*
* 왼무게, 오른무게, 정답, 깊이, 완성된순열
*/
static void dfs(int left, int right, int depth, int arr[])
{
if(left<right)
{
return;
}
if(depth==N)
{
answer++;
return;
}
dfs(left+arr[depth],right,depth+1,arr);
dfs(left,right+arr[depth],depth+1,arr);
}
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T= Integer.parseInt(br.readLine());
for(int test=1;test<=T;++test)
{
N=Integer.parseInt(br.readLine());
st=new StringTokenizer(br.readLine());
arr= new int[N];
for(int i=0;i<N;++i)
{
arr[i]=Integer.parseInt(st.nextToken());
}
//입력끝
visit= new boolean[N];
result=new int[N];
comb(0);
System.out.println("#"+test+" "+answer);
answer=0;
}
}
}
'Algorithm > swea' 카테고리의 다른 글
swea 7465 창용 마을 무리의 개수 //유니언 파인드, 버퍼드라이터 (0) | 2022.08.23 |
---|---|
1247. [S/W 문제해결 응용] 3일차 - 최적 경로 (0) | 2022.08.19 |
5644. [모의 SW 역량테스트] 무선 충전 (0) | 2022.08.17 |
swea: 4012 요리사 (0) | 2022.08.12 |
1861. 정사각형 방 (0) | 2022.08.09 |