티스토리 뷰

알고리즘/백준

14225번 부분수열의 합 백준 파이썬

글을 쓰는 개발자 2020. 12. 20. 20:53
반응형

문제:www.acmicpc.net/problem/14225

 

14225번: 부분수열의 합

수열 S가 주어졌을 때, 수열 S의 부분 수열의 합으로 나올 수 없는 가장 작은 자연수를 구하는 프로그램을 작성하시오. 예를 들어, S = [5, 1, 2]인 경우에 1, 2, 3(=1+2), 5, 6(=1+5), 7(=2+5), 8(=1+2+5)을 만들

www.acmicpc.net

 

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
import sys
input=sys.stdin.readline
N=int(input())
li=list(map(int,input().rstrip().split()))
visited=[False]*N
li.sort()
sumList=[]
maxNum=2000000
numList=[False]*(maxNum)
numList[0]=True
def func(ceil,aim,sum,ans):
    if ceil==aim:
        return
    for i in range(len(li)):
        if not ans:
            visited[i]=True
            sum+=li[i]
            numList[sum]=True
            ans.append(i)
            func(ceil+1,aim,sum,ans)
            ans.pop()
            sum-=li[i]
            visited[i]=False
        elif not visited[i] and ans[-1]<i:
            visited[i]=True
            sum+=li[i]
            ans.append(i)
            numList[sum]=True
            func(ceil+1,aim,sum,ans)
            ans.pop()
            sum-=li[i]
            visited[i]=False
        
func(0,len(li),0,[])
cnt=1
while True:
    if numList[cnt]==False:
        print(cnt)
        break
    else:
        cnt+=1
cs

윗 부분은 내가 작성한 코드다. 풀이방법은 모든 수열을 만들면서 조사하는 형식으로 했다. 그러면서 가능한 수들은 리스트에서 True로 설정하고 1부터 반복문을 돌면서 for문에서 False를 만나면 답을 출력하는 형식으로 작성하였다.

근데 이 코드의 단점은 시간복잡도가 꽤 큰 편에 속한 것이 문제였다. 

그래서 다른 사람의 코드를 참고해봤다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
= int(input())
= list(map(int,input().split()))
= [False]*(n*100000+10)
def go(i, sum):
    if i == n:
        c[sum] = True
        return
    go(i+1,sum+a[i])
    go(i+1,sum)
go(0,0)
= 1
while True:
    if c[i] == False:
        break
    i += 1
print(i)
cs

윗 코드를 설명해보자면 이제 각각의 수는 포함되는 경우와 포함되지 않는 경우 두가지 경우가 있는데 이를 코드로 표현하면 go함수와 같다.

그리고 다음 반복문은 내 코드와 같다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함