Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- react
- JS
- 코테
- DFS
- 백준알고리즘
- DP
- 완전탐색
- DFS기초
- 블챌
- 문자열
- DFS활용
- 재귀
- 구현
- BFS
- 그리디알고리즘
- django
- 파이썬
- socket.io
- 자료구조
- 그리디
- 백준
- Express
- CSS
- 스택자료구조
- 코딩테스트실력진단
- 스택
- 코딩테스트
- 코드트리
- react-query
- 알고리즘
Archives
- Today
- Total
꾸준하게 거북이처럼
DFS활용 - 최대점수 구하기 본문
def DFS(L,sum):
global max
result = 0
if sum > m:
for i in range(L - 1):
result += a[index[i]][0]
if max < result:
max = result
elif sum == m:
for i in range(L):
result += a[index[i]][0]
if max < result:
max = result
else:
for i in range(n):
if a[i][1] not in res:
index[L] = i
res[L] = a[i][1]
DFS(L+1,sum + a[i][1])
if __name__ == "__main__":
n, m = map(int,input().split())
res = [0] * n
index = [0] * n
a = []
max = 0
for i in range(n):
a.append(list(map(int,input().split())))
DFS(0,0)
print(max)
# n개의 문제를 m이라는 제한 시간안에 풀어야한다. n개의 줄에서 (문제를 맞췄을 때 점수, 푸는데 걸리는 시간)을 입력
# 받고, 제한시간에 받을 수 있은 최대 점수를 구하자. *해당 시간이 지나면 문제를 푼 것으로 간주
# 나의 풀이: 순열처럼 제한 시간을 뽑아서 제한 시간 m을 넘었다면 그 전까지의 즉, L-1 레벨까지 뽑았던 점수를 더한다.
# m과 같다면 L레벨까지 뽑았던 점수를 더한다. => 그 후 점수가 이전의 max 값보다 크면 max를 update 한다.
# 주의해야 할 것은 2차원 배열을 사용하기 때문에 해당 제한시간을 뽑았을 때의 점수를 알아야 하기 때문에 index라는 배열을
# 사용해서 해당 index를 저장했다. L 레벌에서는 i라는 Index를 뽑았고 라는 식으로.
# res 배열에는 뽑았던 문제의 시간제한을 저장하고 이미 앞에서 뽑았던 문제인지 확인을 위함이다. -> if a[][1]not in res[xx]
def dfs(L, sum, time):
global res
if time > m:
return
if L == n:
if sum > res:
res = sum
else:
dfs(L+1,sum + score[L],time + pt[L])
dfs(L+1,sum,time)
if __name__ == "__main__":
n, m = map(int,input().split())
score = [] # 점수합을 담을 배열
pt = [] # 문제 푸는 데 걸리는 시간을 담을 배열
for i in range(n):
a, b = map(int,input().split())
score.append(a)
pt.append(b)
res = -2147000000
dfs(0,0,0)
# 정답풀이: 결국 이 문제에서 포인트는 문제를 풀었냐 안풀었냐이다. 제한 시간안에 얻을 수 있는 최대 점수이기 때문에
# 어떤 문제를 풀었는가에서 점수 합을 구하면 되는 것이다. 이는 부분집합으로 문제를 풀 수 있다.
# {1,2,3,4,5} 1번 ~ 몇 번 문제를 풀었을 때, 시간 제한안이며, 점수가 최대면 된다.
# 시간제한 과 점수 각각 합을 구해야하며 DFS로 문제를 풀기 때문에 매개변수로 전달해가면서 합을 축적해나갈 수 있다.
# 꼭 2차원배열을 활용할 필요는 없다.
# 나는 문제를 풀 때 문제 푸는 순서에 따라서 걸리는 시간이 달라지겠지? 이런 생각을 무심코 순열로 문제를 풀었다...
시간제한을 두고 문제를 푸는 것이 아니기 때문에 좀 더 신중히 생각하고 더 효율적인 문제풀이를 떠올리는 연습을 하쟈! 괜찮다!
'Algorithm 문제 & 공부 > DFS' 카테고리의 다른 글
양쪽저울문제 (0) | 2022.06.26 |
---|---|
휴가 - 삼성 SW 역량 테스트 문제 (0) | 2022.06.25 |
경로탐색 (0) | 2022.06.24 |
라이브러리를 이용한 순열 추측 (0) | 2022.06.23 |
수들의 조합 (0) | 2022.06.23 |
Comments