코딩테스트/SWEA

[Python, 파이썬] SWEA 3752. 가능한 시험 점수

알코딩 2024. 10. 17. 04:32

 

학생들이 받을 수 있는 점수로 가능한 경우의 수는 몇 가지가 있는지 구하는 문제.

 

 

 

T = int(input()) # 테스트케이스의 개수 T

for test_case in range(1, T+1):

    N = int(input()) # 자연수의 개수 N
    test = list(map(int, input().split())) # N개의 시험점수
    comb = set({0}) # 점수 조합을 저장하는 list

    for i in range(N):
        for element in comb.copy(): # set은 반복 중 바꾸면 Error, 그래서 copy 해준 값으로 반복
            comb.add(element+test[i]) # 현재 탐색중인 값을 저장된 조합 리스트에 ++

    print("#%d %d" %(test_case, len(comb)))
 

 

 

[문제풀이]


 

 

모든 경로를 확인하는 완전 탐색 문제.

그러나 DFS+백트래킹을 사용할 시 시간 초과가 난다.

 

DFS의 시간복잡도는 2^n으로 N이 최대 100인 이 문제의 시간복잡도는 2^100으로 절대 Python에 주어진 4초 안에는 풀 수 없다. 그래서 생각해야 하는 다른 방법이 바로 DP!

 

 

중복을 방지하는 set와 시험점수 배점 배열을 각각 만든다.

우선, 처음 저장된 점수 조합은 {0} 하나뿐이다.

그리고 각 배점을 추가할 때마다 기존의 가능한 점수에 배점을 더하여 새로운 점수 조합을 만드는 과정을 반복하면 된다.

 

배점이 2만 있을 때는 set에 들어있는 값들에 2를 더하여 {0, 2}.

그리고 배점 3이 추가될 경우, {0, 2}에 각각 3을 더해 {0, 2, 3, 5}.

이 과정에서 중복은 set이 알아서 삭제하며, 이렇게 모든 배점을 반복하면 가능한 모든 점수 조합을 얻을 수 있다!