백준 Silver III | 15649 | Python | 문제 링크
문제 설명
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안 되며, 각 수열은 공백으로 구분해서 출력한다. 수열은 사전 순으로 증가하는 순서로 출력한다.
입출력 예
| 입력 | 출력 |
|---|---|
| 4 2 | 1 2 1 3 1 4 2 1 2 3 2 4 3 1 3 2 3 4 4 1 4 2 4 3 |
나의 풀이
풀이 1
def backtrack(seq, visited):
if len(seq) == m:
print(' '.join(map(str, seq)))
return
for i in range(1, n + 1):
if not visited[i]:
visited[i] = True
seq.append(i)
backtrack(seq, visited)
seq.pop()
visited[i] = False
n, m = map(int, input().split())
visited = [False] * (n + 1)
backtrack([], visited)
풀이 설명
백트래킹으로 길이 M의 수열을 만든다. 1부터 N까지 순서대로 시도하므로 사전순이 자연스럽게 보장된다.
visited[i]— 이미 수열에 포함된 숫자인지 추적seq.pop()과visited[i] = False— 재귀 호출 후 상태를 원래대로 복원(백트래킹)len(seq) == m— 수열 길이가 M에 도달하면 출력하고 복귀
풀이 2
from itertools import permutations
n, m = map(int, input().split())
for p in permutations(range(1, n + 1), m):
print(' '.join(map(str, p)))
itertools.permutations는 입력 순서를 기준으로 사전순 순열을 생성한다. range(1, n + 1)이 오름차순이므로 별도 정렬 없이 조건을 충족한다.
'CodingTest > BeakJoon' 카테고리의 다른 글
| [1182] 부분수열의 합 (0) | 2026.03.31 |
|---|---|
| [15650] N과 M (2) (0) | 2026.03.31 |
| [1158] 요세푸스 문제 (0) | 2026.03.31 |
| [7785] 회사에 있는 사람 (0) | 2026.03.24 |
| [1920] 수 찾기 (0) | 2026.03.24 |
