알고리즘/Python

[백준] 15657 - N과M

9__bin 2023. 7. 23. 17:03

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

 

15657번: N과 M (8)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열

www.acmicpc.net

문제 한줄 이해

-주어진 N개의 숫자 중에서 M개를 뽑을때 이미 선택된 숫자를 뽑아되는 경우에서 겹치지 않는 수열 구하기

 

생각난 풀이

1번째 방법: 이전 N과 M의 문제와 아이디어는 같지만 추가된 조건이 있다. 1부터 N까지 숫자가 아닌 주어진 N개의 숫자 중에서 M개를 뽑아야 하는점, 비내림차순으로 출력해야하는 점

백트래킹이 생각나 재귀를 통한 DFS를 사용했다.

일단 기본적인 아이디어는 https://9-bin.tistory.com/entry/%EB%B0%B1%EC%A4%80-15652-N%EA%B3%BC-M 에 있다!

주어진 N개를 다루기 위해서 나는 리스트로 입력을 받았고 비내림차 순으로 출력해주기 위해 재귀함수를 실행하기 전에 sort를 사용해 정렬을 해주었다.

이유는 정렬을 해주게 되면 for문에 의해 순차적으로 탐색을 진행할 것이기 때문이다.

import sys

n, m= map(int,sys.stdin.readline().split())
numlist = list(map(int,sys.stdin.readline().split()))
numlist.sort()

result = []

def back(start):
    if len(result) == m:
        print(*result)
        return
    
    for i in range(start,n):
        if numlist[i] not in result:
            result.append(numlist[i])
            back(0)
            result.pop()
back(0)

'알고리즘 > Python' 카테고리의 다른 글

[백준] 16953 - A -> B  (0) 2023.07.28
[백준] 11725 - 트리의 부모 찾기  (0) 2023.07.24
[백준] 15652 - N과 M  (0) 2023.07.21
[백준] 14500 - 테트로미노  (0) 2023.07.20
[백준] 9019 - DSLR  (0) 2023.07.19