SWEA-3752-가능한 시험 점수
업데이트:
풀이
문제조건 해석
가능한 점수의 경우의 수 찾는 문제다. 특별한 테크닉을 사용해야 한다.
알고리즘
BFS와 메모이제이션 기법으로 가까스로 통과하긴 했다.
하지만, 이 문제는 완전탐색 또는 DP 문제가 아니다.
최대 점수 범위 내 모든 점수에 대해 가능한지 여부를 담는 배열을 선언하고
모든 문제를 순회하며 가능한 점수에 대해 문제 점수를 더한다.
기존 가능한 점수 + 더한 문제 점수
는 새롭게 가능한 점수
가 된다.
코드
for t in range(1, int(input())+1):
n = int(input())
scores = [int(x) for x in input().split()]
dp = [False for _ in range(sum(scores)+1)]
# dp[i] : i가 받을 수 있는 점수이면 True
dp[0] = True # 0은 항상 가능한 점수
for score in scores:
for i in range(len(dp)-1, -1, -1):
# 역순으로 순회해야 업데이트된 dp값에 접근하지 않음
if dp[i]: # i는 더할 수 있는 점수
dp[i+score] = True
print('#{}'.format(t), sum(dp))
배운점
경우의 수 문제에서 이 문제와 같은 테크닉을 사용하는 유형은?
- 중복을 무시해야 한다.
- 경우의 수의 범위가 한정적이어야 한다(이 문제에서는
100*100
) - $O(N배점N)$
댓글남기기