https://school.programmers.co.kr/learn/courses/30/lessons/131705
// 중복배제
public class 경우의수3_조합 {
static int[] arr; //원소
static int n ; // 답의 길이 ,깊이
static boolean[] visited; //사용여부
static int[] result; //답 저장배열
public static void main(String[] args) {
// 원소 {1,2,3} 에 대한 모든 숫자 조합
arr = new int[] {1,2,3}; //반복 할 숫자
n = 2; //출력할 숫자 조합 길이
result = new int[n]; //정답 저장할 배열
visited = new boolean[arr.length];
recur(0,0); //깊이 0, 시작 위치 0 전달
}
private static void recur(int depth, int start) { // start
//종료조건
if(depth==n) { //깊이와 답 길이가 동일하면
printResult(); //result 값 출력
return; //else안쓰려고 return을 씀
}
//처리코드(result에 숫자 누적)
for (int i = start; i < arr.length; i++) { //i는 0부터가 아니라 start
if(visited[i]==false) { // arr[i]의 숫자가 미 사용인 경우에만 사용
result[depth] =arr[i]; //깊이 자리에 i번째 숫자저장
visited[i]=true;
recur(depth+1,i+1); // 깊이증가 후 재귀호출 ,arr[1]은썻으니 arr[2]부터 쓰시오.
visited[i]=false;
}}
}
//답 출력
private static void printResult() {
for (int i : result) { //result에서 순서대로 추출
System.out.print(i); //붙여서 출력
}
System.out.println();
}
}
//부분집합과 다른점은, 무조건 r개를 뽑아야 한다는 것이다
import java.util.*;
class Solution {
static int[] result;
static boolean[] check;
static int answer;
public int solution(int[] number) {
result = new int[3];
check = new boolean[number.length];
re(0,number.length,number,0);
return answer;
}
public static void re(int depth,int n, int[] arr,int start){
if( depth == 3){
int sum=0;
for( int i : result){
sum +=i;
}
if(sum==0){
answer++;
}
return;
}
for(int i =start; i< n; i++){
if(check[i]==false){
check[i] =true;
result[depth] = arr[i];
re(depth+1,n,arr,i+1);
check[i]=false;
}
}
}
}