문제
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
풀이방법
weight배열에 입력을 받고, perm함수를 사용해서 나올수 있는 경우들을 구한다. 이때, 무게추를 올려놓는 순서가 중요하므로 순열을 사용해 구한다.
rightleft함수를 사용해서 추를 왼쪽으로 올렸을때, 오른쪽으로 올렸을때를 구해준다.
이때 left+get[index] >= right조건과 left >= right+get[index]조건을 걸어서, 오른쪽 위에 올라가있는 무게의 총합이 왼쪽에 올라가 있는 무게의 총합보다 커지지 않게 해준다.
코드
import java.util.Arrays;
import java.util.Scanner;
public class Solution {
static int weight[];
static int get[];
static boolean visit[];
static boolean visit2[];
static boolean[] select;
static int N,total,total2;
static int result;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
int T=input.nextInt();
for(int t=0; t<T; t++) {
N=input.nextInt();
weight = new int[N];
for(int i = 0; i<N; i++) {
weight[i]=input.nextInt();
}
visit = new boolean[N];
visit2 = new boolean[N];
get = new int[N];
select = new boolean[1000];
result=0;
perm(0);
System.out.printf("#%d %d",t+1,result);
System.out.println();
}
}
static void perm(int cnt) {
if(cnt==N) {
total++;
rightleft(0,0,0);
return;
}
for(int i=0; i<N; i++) {
if(visit[i]==false) {
visit[i]=true;
get[cnt]=weight[i];
perm(cnt+1);
visit[i]=false;
}
}
}
static void rightleft(int index,int left, int right) {
if(index==N) {
result++;
return;
}
//이 숫자를 왼쪽으로 뽑을게
if(left+get[index] >= right) {
rightleft(index+1,left+get[index],right);
}
else {
return;
}
//이 숫자를 오른쪽으로 뽑을게
if(left >= right+get[index]) {
rightleft(index+1,left,right+get[index]);
}
else {
return;
}
}
}
'알고리즘 > SW Expert Academy 문제풀이' 카테고리의 다른 글
[SW Expert Academy Java]3289 서로소 집합 (1) | 2022.09.21 |
---|---|
[SW Expert Academy Java] 1954 달팽이 숫자 (0) | 2022.09.12 |
[SW Expert Academy Java] 4112 이상한 피라미드 탐험 (0) | 2022.09.12 |
[SW Expert Academy Java] 1247 S/W 문제해결 응용 3일차 - 최적 경로 (0) | 2022.09.12 |
댓글