알고리즘/코드트리 문제풀이
코드트리 [자바 java] k개 중에 1개를 n번 뽑기
잔디🌿
2023. 7. 26. 23:09
https://www.codetree.ai/missions/2/problems/n-permutations-of-k-with-repetition/description
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
이 문제는 두 수가 주어지면 차례대로 순열을 만들어서 출력하는 프로그램이다.
알고리즘 풀 때 많이 사용되는 개념인데, 매번 풀 때마다 헷갈리는 것 같다.
문제의 조건에 따라 따져야 할 것이 많은데, 이 문제는 중복을 허용하고, 오름차순, 내림차순에 대한 기준이 없다. 따라서 재귀함수에서 for문을 돌 때 현재 i의 값을 넘겨주지 않아도 되고(오름, 내림 x) , 현재 탐색하고 있는 i값의 방문여부도 상관하지 않아도 된다.
처음에 StringBuilder을 사용하지 않아서 시간초과가 나왔는데, 수정하니 정상적으로 작동했다.
import java.io.*;
import java.util.*;
public class Main {
static int[] arr;
static int m;
static int n;
static StringBuilder sb;
static void print(){
for(int i = 0;i<m;i++){
sb.append(arr[i]).append(" ");
}
sb.append("\n");
}
static void make(int size){
if(size == m){
print();
}
else{
for(int i = 1;i<= n;i++){
arr[size] = i;
make(size+1);
}
}
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
sb = new StringBuilder();
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
arr = new int[m];
make(0);
System.out.println(sb);
}
}