코딩 테스트/백준

[백준 15649번] N과 M (1)

nan-noo 2023. 4. 27. 23:34
728x90

https://www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

순열 구하는 문제

# 1 <= M, N <= 8

import sys

readline = sys.stdin.readline


def recursive(n, r, selected_numbers):
    if len(selected_numbers) == r:
        print(" ".join(map(str, selected_numbers)))
        return

    for num in range(1, n + 1):
        if num in selected_numbers:
            continue

        new_selected_numbers = selected_numbers + [num]
        recursive(n, r, new_selected_numbers)


def permutation(n, r):
    selected_numbers = []
    recursive(n, r, selected_numbers)


n, m = map(int, readline().split())

permutation(n, m)

위 방법은 rest_numbers 배열을 넘기지 않는다.

# 1 <= M, N <= 8

import sys

readline = sys.stdin.readline


def recursive(r, selected_numbers, rest_numbers):
    if len(selected_numbers) == r:
        print(" ".join(map(str, selected_numbers)))
        return

    for num in rest_numbers:
        new_selected_numbers = selected_numbers + [num]
        new_rest_numbers = [k for k in rest_numbers if k != num]
        recursive(r, new_selected_numbers, new_rest_numbers)


def permutation(n, r):
    rest_numbers = [i for i in range(1, n + 1)]
    selected_numbers = []
    recursive(r, selected_numbers, rest_numbers)


n, m = map(int, readline().split())

permutation(n, m)

파이썬의 itertools를 사용하지 않고 직접 구현해봤다. 재귀함수 아직도 익숙하지가 않아..

원리 -  이미 선택한 숫자는 또 탐색하지 않고 건너뛰면서 다음 숫자를 재귀적으로 탐색한다. 사실상 완전 탐색 문제라고 봐도 될 듯..? 선택한 숫자의 개수가 조건에 맞으면 탐색을 멈춘다.

나뭇가지 그림을 그려보면 쉬운데, 예를들어 4P3을 해야하면

선택 1 선택 2 선택 3
1 2 3
    4
  3 2
    4
  4 2
    3
... ... ...

요런 식으로 그림을 그려서 경우의 수가 24가지인 것을 알 수 있다. 총 3번의 선택을 하고, 각각의 선택마다 가능한 경우를 또 탐색해나가야 한다.

반복문으로 구현해보려고 했는데, 트리가 n개만큼 생기는 거라서 좀 어려웠다.

728x90

'코딩 테스트 > 백준' 카테고리의 다른 글

[백준 9663번] N-Queen  (2) 2023.04.15
[백준 1916번] 최소 비용 구하기  (0) 2023.04.15
[백준 2252번] 줄 세우기  (0) 2023.04.15
[백준 1976번] 여행 가자  (0) 2023.04.15
[백준 1717번] 집합의 표현  (0) 2023.04.14