모눈종이에 사각사각

[백준 15649] N과 M (1) 본문

CodingTest/Baekjoon

[백준 15649] N과 M (1)

모눈종이씨 2022. 6. 27. 12:34

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

문제링크

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

 

15649번: N과 M (1)

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

www.acmicpc.net

 

⚾ 코드

# 순열 직접 구현
n, m = map(int, input().split())
cnt = m
numbers = list(range(1, n+1))

res = []


def permutation(pre, now, m):
    if len(now) < m or m == 0:
        return pre

    for i in range(len(now)):
        pre.append(now[i])
        temp = permutation(pre, now[:i]+now[i+1:], m-1)
        if temp and len(temp) == cnt:
            # res.append(temp[:])
            print(*temp)
        pre.pop()


permutation([], numbers, m)
# print(res)

 

🔔 해결 과정 & 깨달은 점

- itertools의 permutations를 쓰지 않고 순열을 직접 구현해보고 싶었다.

 

- 구현한 원리는 다음과 같다.

예를 들어 1,2,3,4 중에서 중복없이 2개를 뽑아 순열을 구한다고 하자.

잘 생각해보면 1, 2, 3, 4에서 2개를 뽑는 것1을 뽑고 2, 3, 4중에서 1개를 뽑는 경우의 수2를 뽑고 1, 3, 4중에서 1개를 뽑는 경우의 수3을 뽑고 1, 2, 4중에서 1개를 뽑는 경우의 수4를 뽑고 1, 2, 3 중에서 1개를 뽑는 경우의 수를 합한것과 같다.

식으로 나타내자면

permutation([], [1, 2, 3, 4], 2) = permutation([1], [2, 3, 4], 1) + permutation([2], [1, 3, 4], 1) + permutation([3], [1, 2, 4], 1) + permutation([4], [1, 2, 3], 1) 이다.

 

백트래킹의 원리로 풀 수 있다.

종료 조건은 m이 0이 되거나 현재 탐색해야 하는 숫자의 길이보다 작을 때 종료된다.

 

'CodingTest > Baekjoon' 카테고리의 다른 글

[백준 5547] 일루미네이션  (0) 2022.06.28
[백준 15650] N과 M (2)  (0) 2022.06.27
[백준 19637] IF문 좀 대신 써줘  (0) 2022.06.12
[백준 2470] 두 용액  (0) 2022.05.12
[백준 20922] 겹치는 건 싫어  (0) 2022.05.11
Comments