
https://www.acmicpc.net/problem/15666
문제
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- N개의 자연수 중에서 M개를 고른 수열
- 같은 수를 여러 번 골라도 된다.
- 고른 수열은 비내림차순이어야 한다.
- 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
풀이
def go(arr):
if len(arr) == M:
print(*arr)
return
for i in li:
if not arr or arr[-1] <= i:
arr.append(i)
go(arr)
arr.pop()
N, M = map(int, input().split())
li = sorted(set(map(int, input().split())))
go([])
백트래킹을 사용하여 풀 수 있다.
1. N과 M을 입력받는다.
2. N개의 수를 입력받는데, 이때 출력 시 증가하는 순으로 출력해야 하므로 sorted된 상태로 저장한다. 또 만약 li에 중복되는 수가 있을 경우에는 같은 수열이 출력될 수 있으므로 set으로 저장한다.
3. 빈 배열을 사용해 go 함수를 호출한다.
[go 함수 설명]
파라미터로 arr을 입력받고, 만약 arr의 길이가 아직 우리가 원하는 길이가 아닐 때는 li의 요소들을 번갈아가며 append 해준다. 이때 문제에서 "비내림차순"이어야 한다는 조건이 있었으므로, if문을 사용해 조건을 충족할 때만 append해준다. append 후에는 변경된 리스트로 다시 go 함수를 호출하여 원하는 길이가 되었는지를 확인하고, 원하는 길이라면 출력 후 제일 뒤 원소를 지우고 li의 다른 값을 넣는다.
'Coding Test > Problems' 카테고리의 다른 글
| [BOJ | Python] 10816번: 숫자 카드 2 (0) | 2025.04.07 |
|---|---|
| [BOJ | Python] 8911번: 거북이 (1) | 2025.04.06 |
| [BOJ | Python] 2473번: 세 용액 (0) | 2025.04.03 |
| [BOJ | Python] 1244번: 스위치 켜고 끄기 (0) | 2025.04.01 |
| [BOJ | Python] 15988번: 1, 2, 3 더하기 3 (0) | 2025.03.28 |