본문 바로가기
알고리즘/코드트리 문제풀이

코드트리 [자바 java] k개 중에 1개를 n번 뽑기

by 잔디🌿 2023. 7. 26.

    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);
    
        }
    }