인프런 커뮤니티 질문&답변

drather님의 프로필 이미지
drather

작성한 질문수

파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)

10. 조합구하기(DFS)

안녕하세요? 강의에서 말씀해주신 방법의 응용에 대해 질문 드립니다.

해결된 질문

작성

·

207

0

혹시, 강의에 나오지 않은 다른 문제에 대한 질문은 받지 않으신다면 아래 내용은 읽지 않으셔도 됩니다!!

안녕하세요? 강의에서 말씀해주신 방법의 응용에 대해 질문 드립니다. 

이 문제를 열심히 풀어보고 난 뒤 숙달을 위해 백준사이트의 N과M 시리즈 문제들을 풀어보고 있습니다. 

그 중, 다른 문제들은 해결했지만, '원소간 중복을 허용하는 조합'을 뽑아내는 문제를 해결하는데 어려움이 있습니다. 아래 링크가

"N개의 숫자 중, 중복을 허용하여 M개를 뽑아 만들 수 있는 '조합'을 출력하는 문제"입니다. 

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

이 문제를 해결하고자 한다면, 선생님께서 알려주신 코드를 어떻게 고쳐야 풀 수 있을까요? 

위 질문 외에, 혹시 조금 더 상급 수준의 코스를 만들어 올려주실 생각이 있으신지 궁금합니다. 선생님의 코스를 따라가며 많이 실력이 늘었기 때문입니다. 

무더워가 어느정도 지나가고, 날이 점점 선선해지는 듯한 계절입니다. 이럴때일수록 몸 건강히 챙기시고, 코로나도 각별히 유의하시기 바랍니다. 

답변 2

1

김태원님의 프로필 이미지
김태원
지식공유자

제공한 조합 코드에서 DFS호출부분을 

DFS(L+1, i) 와 같이 바꾸면 중복조합이 됩니다. 문의하신 백준문제를 조합문제 코드를  수정해서 풀어보면 아래와 같습니다.

def DFS(L, s):
    if L==m:
        for i in range(m):
            print(arr[res[i]], end=' ')
        print()
    else:
        for i in range(s, n):
            res[L]=i
            DFS(L+1, i)
           

n, m=map(int, input().split())
arr=list(map(int, input().split()))
arr.sort()
res=[0]*(n+1)
cnt=0
DFS(0, 0)

0

drather님의 프로필 이미지
drather
질문자

오.. 정말 대단하십니다. 알려주신 방법을 잘 응용하기만 한다면 정말 다양한 유형의 문제들을 풀 수 있군요!! 좋은 스킬 알려주셔서 감사합니다! 꼭 완벽히 제것으로 만들어서 좋은 결과를 내도록 하겠습니다!! 

drather님의 프로필 이미지
drather

작성한 질문수

질문하기