[Python][Recursive]중복을 허용한 특정길이 부분집합 생성

 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
a = [False, False] + [True] * n
prime = []
for i in range(n+1):
    if a[i]:
        prime.append(i)
        for j in range(2*i, n+1, i):
            a[j] = False

def recur(r):
    global result, num
    stack.append(r)
    if len(stack) == 3:
        sss = sorted(stack)
        if sum(sss) == num and sss not in result:
            result.append(sss)
    else:
        for i in lst:
            if len(stack) < 3: # 중복을 허용하기 위한 조건문 삽입. 없으면 stack overflow
                recur(i)
            stack.pop()

for t in range(int(input())):
    num = int(input())
    for k in range(len(prime)):
        if prime[k] >= num:
            lst = prime[:k]
            break
    result = []
    for j in lst:
        stack = []
        recur(j)
    print("#{} {}".format(t+1, len(result)))
    
    
### 3중 포문을 이용한 부분집합 구현 ###
for j in range(int(input())):
    n=int(input())
    p=[0,0]+[1]*(n-1)
    b=[]
    for i in range(2,n+1):
        if p[i]:
            b+=[i]
            asd =((n//i)-1)
            p[2*i::i]=[0]*asd
    c=0
    for a in b:
        for d in b[b.index(a)::]:
            for k in b[b.index(d)::]:
                if n==a+d+k:
                    c+=1
    print(f'#{j+1} {c}')
5986. 새샘이와 세 소수

댓글

이 블로그의 인기 게시물

[python]섬의 둘레구하기

백트래킹으로 부분집합구하기(Get Powerset usiing Backtracking)

[패턴매칭][Python]보이어 무어 알고리즘