코딩 테스트/백준
[Python] 백준 15650 N과 M (2)
위시리
2024. 9. 24. 02:13
문제 분석
- 1~n까지 자연수 중 중복 없이 m개를 고른 수열
- 고른 수열은 오름차순 : 순서가 없음
- 조합
코드 설계
- 수열에 넣을 ans = [ ]
- 종료조건 : len(arr) == m
- 고른 수열이 오름차순이 되도록 어떻게?
- ans에 없으면 넣을 건데,
- i가 현재 넣을까? 하는 수
- 만약 i가 j(ans)에 들어있는 수 보다 작으면 continue (오름차순)
- 작으면 append - dfs - pop
정답 코드
1차 - 틀림
import sys
input = sys.stdin.readline
n,m = list(map(int, input().split()))
ans = []
def dfs():
if len(ans) == m :
print(' '.join(map(str, ans)))
return
for i in range(1, n+1):
if i not in ans: # 중복x
if len(ans) > 0 : # ans가 비어있지 않다면
for j in ans:
if i <= j : # 이미 들어있는 수가 더 크면 continue
continue
else :
ans.append(i)
dfs()
ans.pop()
else : # 비어있다면
ans.append(i)
dfs()
ans.pop()
dfs()
넣고 i가 증가 안해서 1을 넣고 다시 dfs( )
2차
import sys
input = sys.stdin.readline
n,m = list(map(int, input().split()))
ans = []
def dfs(start):
if len(ans) == m :
print(' '.join(map(str, ans)))
return
for i in range(start, n+1):
if i not in ans: # 중복x
ans.append(i)
dfs(i+1)
ans.pop()
dfs(1)
..
itertools
import sys
from itertools import combinations
input = sys.stdin.readline
n, m = map(int, input().split())
arr = [ i for i in range(1,n+1) ]
for i in combinations(arr, m) :
for j in i :
print(j, end = ' ')
print()