Data Structures & Algorithms

[Algorithms] 완전탐색(백트랙킹, 상태트리와 CUT EDGE)/깊이우선탐색(DFS) Basic-수열 추측하기(순열, 파스칼 응용)

숄구-ml 2022. 5. 26. 10:32

 

 

  • 파스칼의 삼각형의 원리를 떠올려보면 규칙을 발견할 수 있는 문제

 

  • 이제 원리를 파악했으면 주어진 문제를 이를 기반으로 규칙을 찾아보자

 

  • 코드 구현에 필요한 자료구조

 

 

  • 원소의 개수가 주어졌을 때, 해당 숫자들의 조합을 만드는 코드를 구현해보자

 

    • 전체 코드 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
def DFS(level, sum):
 
    if level==and sum==target:
        for x in n_ls:
            print(x, end=" ")
        sys.exit(0)             # 사전순으로 print 하라고 하였는데 코드에서 이미 사전순으로 시작을 하므로
                                # 처음 발견하자마자 종료시키면 된다
    else:
        for i in range(1, n+1):
            if check_ls[i]==0:
                check_ls[i]=1
                n_ls[level]=i
                DFS(level+1, sum+(n_ls[level]*combination_ls[level]))
                check_ls[i]=0
 
 
if __name__=='__main__':
    n, target = map(int, input().split())
    check_ls=[0]*(n+1)
    n_ls=[0]*n
    combination_ls = [1* n    # n열에 해당하는 파스칼 삼각형의 조합을 찾아라
    for i in range(1, n):       # 항상 양쪽 끝은 1이므로 1부터 시작했다
        combination_ls[i] = combination_ls[i-1]*(n-i)//i
 
    DFS(00)
 
cs

 

 

    • 위에 처럼 DFS를 이용하여 코드 짜는 방식 말고, 파이썬 라이브러리를 이용할 수 있다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import sys
import itertools as it #itertools 이라는 라이브러리를 이용해 조합을 만들 수 있다
 
 
if __name__=='__main__':
    n, target = map(int, input().split())
 
    combination_ls = [1* n  # n열에 해당하는 파스칼 삼각형의 조합을 찾아라
    for i in range(1, n):  # 항상 양쪽 끝은 1이므로 1부터 시작했다
        combination_ls[i] = combination_ls[i - 1* (n - i) // i
 
    n_ls = list(range(1, n+1))
    for tmp in it.permutations(n_ls, 4):    # n_ls 의 조합을 구하는데 3개를 인수로 하는 조합을 구해라
        res=0
        for idx, comb in enumerate(combination_ls):
            res+=comb*tmp[idx]
 
        if res==target:
            for x in tmp:
                print(x, end=" ")
            break
 
 
cs
728x90