코딩테스트/문제

[백준] 15650번: N과 M (2)

스키(ski) 2023. 12. 19. 13:47
문제 내용

https://www.acmicpc.net/problem/15650

 

15650번: N과 M (2)

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

www.acmicpc.net

 

풀이 시간

4분

풀이 과정

1. (python만) 라이브러리를 이용해서 간단하게 풀이(itertools.combinations 사용)

2. back_tracking을 이용해서 오름차순 조합 구현.

 

정답 코드

 

1. 파이썬

import sys
from itertools import combinations
sys_input=sys.stdin.readline

n,m=map(int,sys_input().rstrip().split())


# 1번 풀이:itertools 사용
for ans in combinations(range(1,n+1),m):
    for x in ans:
        print(x,end=" ")

    print()


# 2번 풀이: backtracking 사용
arr=[i for i in range(1,n+1)]
ans=[]

def back_tracking(prev):
    if len(ans)==m:
        for x in ans:
            print(x,end=" ")
        print()
        return

    if m-len(ans)>n-1-prev:
        return

    for i in range(prev+1,n):
        ans.append(arr[i])
        back_tracking(i)
        ans.pop()

back_tracking(-1)

 

 

2. 자바

import java.io.*;
import java.util.*;

public class p15650 {
    public static List<Integer> ans = new ArrayList<>();
    public static List<Integer> arr = new ArrayList<>();
    public static int n, m;

    public static void back_tracking(int prev) {
        if (ans.size() == m) {
            for (int x : ans) {
                System.out.print(x + " ");
            }
            System.out.println();
            return;
        }

        if (m - ans.size() > n - 1 - prev) {
            return;
        }

        for (int idx = prev + 1; idx < n; idx++) {
            ans.add(arr.get(idx));
            back_tracking(idx);
            ans.remove(ans.get(ans.size() - 1));
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        for (int i = 1; i <= n; i++) {
            arr.add(i);
        }

        back_tracking(-1);
    }
}

 

 

'코딩테스트 > 문제' 카테고리의 다른 글

[백준] 15652번: N과 M (4)  (0) 2023.12.20
[백준] 9663번: N-Queen  (0) 2023.12.20
[백준] 1932번: 정수 삼각형  (0) 2023.12.19
[백준] 11053번: 가장 긴 증가하는 부분 수열  (0) 2023.12.18
[백준] 1149번: RGB거리  (0) 2023.12.18