BOJ 완전탐색 - 백트래킹

ladiolus·2022년 8월 11일
0

Algorithm

목록 보기
7/13
post-thumbnail

🪄 N과 M (1)

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 문제

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
def dfs(start):
    if len(arr) == M:
        print(*arr)
        return

    for i in range(1, N+1):
        if i not in arr:
            arr.append(i)
            dfs(i+1)
            arr.pop()

N, M = map(int, input().split())
arr = []

dfs(1)

itertools 모듈을 사용하거나 dfs로 구현가능한 문제이다. 하나의 리스트가 만들어 질때마다 출력해서 풀면 된다.


🪄 N과 M (2)

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 문제

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
  • 고른 수열은 오름차순이어야 한다.
def dfs(start):
    if len(arr) == M:
        print(*arr)
        return

    for i in range(start, N+1):
        if i not in arr:
            arr.append(i)
            dfs(i+1)
            arr.pop()

N, M = map(int, input().split())
arr = []

dfs(1)

N과 M (1) 문제에서 for문의 범위만 살짝 다르게 고치면 해결된다.


🪄 N과 M (3)

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 문제

  • 1부터 N까지 자연수 중에서 M개를 고른 수열
  • 같은 수를 여러 번 골라도 된다.
def dfs(start):
    if len(arr) == M:
        print(*arr)
        return

    for i in range(1, N+1):
            arr.append(i)
            dfs(i+1)
            arr.pop()

N, M = map(int, input().split())
arr = []

dfs(1)

N과 M (1) 문제에서 if문을 지워서 같은 수를 여러 번 고를 수 있게하면 해결된다.


🪄 N과 M (4)

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 문제

  • 1부터 N까지 자연수 중에서 M개를 고른 수열
  • 같은 수를 여러 번 골라도 된다.
  • 고른 수열은 비내림차순이어야 한다.
  • 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.
def dfs(start):
    if len(arr) == M:
        print(*arr)
        return

    for i in range(start, N+1):
            arr.append(i)
            dfs(i)
            arr.pop()

N, M = map(int, input().split())
arr = []

dfs(1)

N과 M (3) 문제에서 if문을 지워서 같은 수를 여러 번 고를 수 있게하면 해결된다.


🪄 N과 M (5)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 문제

  • N개의 자연수 중에서 M개를 고른 수열
def dfs(start):
    if len(arr) == M:
        print(*arr)
        return

    for i in range(N):
        if data[i] not in arr:
            arr.append(data[i])
            dfs(i+1)
            arr.pop()

N, M = map(int, input().split())
data = list(map(int, input().split()))
data.sort()
arr = []

dfs(0)

입력으로 주어지는 수를 저장하고, 정렬해서 사용하면 해결된다.

0개의 댓글