백준 15649번 : N과 M (1)
문제 : https://www.acmicpc.net/problem/15649
문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
코드
백트래킹 문제
백트래킹 : 현재 상태에서 가능한 모든 후보군을 따라 들어가며 탐색하는 알고리즘.
backtracking(k) 는 arr(k) 를 정한다. m개의 수 중 k번째 수. 각 숫자들은 1부터 n 사이의 수.
"""
boj 15649 - backtracking
From 1 to N,
A sequence with M selected numbers without duplicates.
"""
n, m = map(int, input().split())
arr = [0] * m
is_used = [False] * (n + 1)
def backtracking(k):
"""
backtracking(k) determines arr(k)
"""
if k == m:
for i in range(m):
print(arr[i], end=" ")
print()
return
for i in range(1, n + 1):
if not is_used[i]:
arr[k] = i
is_used[i] = True
backtracking(k + 1)
is_used[i] = False
backtracking(0)
'PS > boj' 카테고리의 다른 글
[BOJ] 백준 1932번 : 정수 삼각형 (0) | 2022.01.11 |
---|---|
[BOJ] 백준 24049번 : 정원 (Easy) (0) | 2022.01.04 |
[BOJ] 백준 24039번 : 2021은 무엇이 특별할까? (0) | 2022.01.04 |
[BOJ] 백준 1260번 : DFS와 BFS (0) | 2021.11.29 |
댓글