-
[백준] 15652번 N과 M(4)Algorithm Study/Python 2021. 4. 19. 04:17
문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 M개를 고른 수열
- 같은 수를 여러 번 골라도 된다.
- 고른 수열은 비내림차순이어야 한다.
- 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
풀이
import sys N, M = map(int, sys.stdin.readline().split()) answer = [] def NandM4(index, N, M): if index == M: print(' '.join(map(str, answer))) return for i in range(N): if any(answer) : if answer[-1] <= i+1 : answer.append(i + 1) NandM4(index + 1, N, M) answer.pop() else : answer.append(i + 1) NandM4(index + 1, N, M) answer.pop() NandM4(0, N, M)
이번 항목은 비내림차순 이라는 부분을 고려해야한다.
itertools에 있는 기능 중에서 쉽게 떠오르는 것이 없어서 재귀를 이용해서만 구현하였다.
중복을 이용할 수 있기 때문에 NandM3에서 구현한 함수를 이용하고 이전에 사용한 숫자보다 큰 숫자인 경우에만
사용할 수 있게 answer[-1] <= i+1 일 때만 추가하도록 변경하였다.
answer 리스트가 비어있는 경우에는 문제가 발생하기 때문에 any를 이용하여 비어있는지 체크하고
비어있다면 기존과 똑같이 1개의 값을 넣어준다.'Algorithm Study > Python' 카테고리의 다른 글
[백준] 15655번 N과 M(6) (0) 2021.04.19 [백준] 15654번 N과 M(5) (0) 2021.04.19 [백준] 15651번 N과 M(3) (0) 2021.04.19 [백준] 15650번 N과 M(2) (0) 2021.04.19 [백준] 15649번 N과 M(1) (0) 2021.04.19