알고리즘/코드트리 문제풀이
코드트리 [자바 java] N개중에 M개 뽑기
잔디🌿
2023. 8. 6. 21:57
https://www.codetree.ai/missions/2/problems/n-choose-m?utm_source=clipboard&utm_medium=text
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
이 문제는 조합을 구해야 한다. 앞선 문제에서는 전부 숫자들의 순서, 중복 여부가 크게 중요하지 않았지만, 여기서는 숫자들이 오름차순으로 정렬되어야 하고 중복 되어서는 안된다.
import java.io.*;
import java.util.*;
public class Main {
static int n;
static int m;
static int[] arr;
static void func(int k, int num){ //k를 파라미터로 전달해서 for문의 시작점으로 정함
if(num == n){
for(int i =0 ;i<n;i++){
System.out.printf("%d ",arr[i]);//배열이 모두 차면 출력
}
System.out.println();
}
else{
for(int i = k;i<=m;i++){// 탐색중인 배열에 수 넣기(파라미터에서 받은 수부터 시작)
arr[num] = i;
func(i+1,num+1);//다음 배열이 현재 수보다 커야하니까 i+1을 k에대한 파라미터로 전달
}
}
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
m = Integer.parseInt(st.nextToken());
n = Integer.parseInt(st.nextToken());
arr = new int[n];
func(1,0); // 첫 배열의 for문은 1부터 시작
}
}
여기서는 func함수의 파라미터가 하나 추가된다. 이렇게 하면 현재 탐색중인 인덱스의 앞 인덱스보다 큰 수를 배정할 수가 없게 되어 자동적으로 오름차순 정렬이 된다. 또한 i+1을 k에 대한 파라미터로 전달함으로서 중복을 방지한다.
또한,
4자리 이진수 | 1-4에서 3개 뽑아 오름차순 정렬 |
0001 | 123 |
0010 | 124 |
0100 | 134 |
1000 | 234 |
이렇게 이진수로 만들고, 0의 위치를 출력하는 방법도 존재한다.