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 |
Tags
- DP
- 백준 18222
- 프로그래머스 java
- 코테
- BFS
- java 프로그래머스
- daily challenge
- 리트코드
- 자바 5464
- dfs
- leetcode
- 파이썬
- 프로그래머스
- java leetcode
- 백준
- 자바
- 스프링 에러
- 코딩테스트
- 자바 리트코드
- 백준 16935
- 그래프 자바
- 인텔리제이 에러
- 리트코드 자바
- 구현
- 리트코드 1557
- 스택
- Java
- 분할정복
- leetcode 1721
- 카카오
Archives
- Today
- Total
레벨업 일지
[Java] leetcode 1626. Best Team With No Conflicts 본문
문제
https://leetcode.com/problems/best-team-with-no-conflicts/description/
알아야 할 개념
- DFS + 메모이제이션
- DP(Dynamic Programming)
풀이
메모이제이션의 패러다임을 깬 문제.
로직은 다음과 같다.
- 주어진 scores , ages 배열을 하나로 합친다.
- ages 기준 오름차순 정렬
- 재귀 함수로 순차 탐색을 하면서, 2가지 행동을 한다.
- 현재 인덱스 ( 현재 번호, 최댓값 번호 ) 를 메모이제이션 하여 중복 탐색을 피한다.
- 답을 리턴한다.
ages를 기준으로 정렬하고 탐색을 하면서 2가지 행동을 한다.
- 리스트 basketList 에 현재 플레이어를 포함시킨다.
- 리스트 basketList 에 현재 플레이어를 포함하지 않고 넘어간다.
재귀 함수의 현재 위치에서는 현재 탐색할 플레이어의 인덱스와 현재 baseketList 의 최댓값을 가진 플레이어의 인덱스 정보 (초기값 -1 ) 가 있다.
재귀 호출을 하면서 현재 플레이어보다 이전의 플레이어가 더 최댓값이면 2가지 행동을 모두 하고, 현재 basketList 최댓값보다 현재 플레이어값이 작으면 1가지 행동만 한다.
[ 현재 플레이어, 이전의 최댓값 ] 을 메모이제이션하여, 중복 탐색을 피한다.
참고
아래 그림은 위 알고리즘을 리트코드 예제 2번에 적용한 것이다.
- 각 재귀에서 왼쪽은 현재 플레이어를 담는 것이고, 오른쪽은 담지 않는것이다.
- 초록색 [[]] 으로 basketList를 나타내였다.
- 살구색(cur, prev) 로나타내고, 현재 탐색할 curPlayer [ age, score ] 을 옆에 기술하였다.
- 재귀 탐색은 dfs로 왼쪽으로 쭉 들어가고 그림을 따라 백트래킹 하면 이해가 편할 것이다.
코드
자바
class Solution {
int memo[][];
int ans = 0;
public int bestTeamScore(int[] s, int[] age) {
//<age, score>
List<int[]> l = new ArrayList<>();
int len = s.length;
memo = new int[len][len+1];
for(int i = 0; i< len ;i++){
l.add(new int[]{age[i], s[i]});
}
Collections.sort(l, (a,b)->a[0]-b[0] == 0 ? a[1]-b[1]: a[0]-b[0]);
return dfs(0,-1,l);
}
public int dfs(int cur, int prev, List<int[]>infoList){
if( cur>= infoList.size() )return 0;
else if(memo[cur][prev+1] > 0 )return memo[cur][prev+1];
else{
if(prev == -1 || infoList.get(prev)[1] <= infoList.get(cur)[1])
return memo[cur][prev+1] = Math.max(dfs(cur+1, cur, infoList) + infoList.get(cur)[1],
dfs(cur+1, prev, infoList));
return memo[cur][prev+1] = dfs(cur+1, prev, infoList);
}
}
}
'알고리즘 > leetcode' 카테고리의 다른 글
[Java] leetcode 103. Binary Tree Zigzag Level Order Traversal (0) | 2023.02.19 |
---|---|
[Java] leetcode 1523. Count Odd Numbers in an Interval Range (0) | 2023.02.13 |
[Java] leetcode 1626. Best Team With No Conflicts (0) | 2023.02.01 |
[Java/Python] leetcode 1137. N-th Tribonacci Number (0) | 2023.01.31 |
[Java] leetcode 352. Data Stream as Disjoint Intervals (0) | 2023.01.28 |
Comments