[백준] 15657 N과 M (8) - 백트랙킹

jckim22·2023년 10월 3일
0

[ALGORITHM] STUDY (PS)

목록 보기
84/86

난이도

Silver 3

풀이 참고 유무

x

막힌 부분

x

문제

문제 바로가기

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
N개의 자연수 중에서 M개를 고른 수열
같은 수를 여러 번 골라도 된다.
고른 수열은 비내림차순이어야 한다.
길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.

입력

첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.

출력

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.

예제 입력

7
6
1 2
2 3
1 5
5 2
5 6
4 7

예제 출력

4

문제 검토

기본적인 백트랙킹 문제이다.

풀이

Java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.Buffer;
import java.util.*;
//아이디어
//배열에 수들을 담고 정렬한다.
//n만큼 반복을 시작하고 depth가 m이 되면 담긴 배열을 출력한다.
//그리고 돌아오면서 조건을 삭제한다.

public class Main {
    static int n,m;
    static ArrayList<Integer> arr;
    static ArrayDeque<Integer> tmp;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st=new StringTokenizer(br.readLine()," ");
        n=Integer.valueOf(st.nextToken());
        m=Integer.valueOf(st.nextToken());
        arr=new ArrayList<>();
        tmp=new ArrayDeque<>();
        st=new StringTokenizer(br.readLine()," ");
        for(int i=0; i<n; i++){
            arr.add(Integer.valueOf(st.nextToken()));
        }
        Collections.sort(arr,new Comparator<Integer>(){
            @Override
            public int compare(Integer s1, Integer s2){
                return s1-s2;
            }
        });
        back(0,0);
    }
    public static void back(int depth,int idx){
        if(depth == m){
            for(int a:tmp){
                System.out.printf("%d ",a);
            }
            System.out.println();
            return;
        }
        for(int i=idx; i<n; i++){
            tmp.add(arr.get(i));
            back(depth+1,i);
            tmp.pollLast();
        }
    }
}

ArrayDeque로 Stack을 사용해서 풀이했다.

아이디어:

주석참고

걸린 시간

13:55

총평

for문의 idx를 다음 재귀 때 넘겨주는 것이 주요하였다.

profile
개발/보안

0개의 댓글