📑 세부 학습 내용
📅 스케쥴
- 3시간 30분 독서 + 궁금한 개념 조사 및 학습 + 1시간 코딩테스트 및 풀이 리뷰
- 총 4시간 30분
🧷 학습 시간 인증
📖 도서 정독 및 실습
실전 레디스 : 기초, 실전, 고급 단계별로 배우는 레디스 핵심 가이드
- 캐싱 등
RDB 의 보조 역할을 해줄 NoSQL 중 가장 범용적이고 유지보수가 잘 진행 중인 Redis 의 구조부터 기초, 심화 내용, 사용법 등을 확실하게 이해하여, 이후의 프로그래밍에 있어 자신 있고 근거 있게 레디스를 채택하고 사용할 수 있는 개발자를 목표로 독서 시작
- 5.2.3 아키텍처 안티 패턴 (p.335) ~ 5.6.2 ACL 기능 (p.379)
- 도서 내 모든 내용 이해 및 실습 완료
✏️ 코딩 테스트
⭕ 문제 풀이
class Solution {
int n;
int[] dp;
List<Integer> groups;
public int solution(int[] cards) {
n = cards.length;
dp = new int[n];
groups = new ArrayList<>();
Arrays.fill(dp, 1);
int group = -1;
int groupIdx = 0;
for (int i = 0; i < n; i++) {
if (dp[i] < 0) {
continue;
}
dp[i] = group;
groups.add(1);
int nextIdx = cards[i] - 1;
while (dp[nextIdx] != group) {
dp[nextIdx] = group;
groups.set(groupIdx, groups.get(groupIdx) + 1);
int curVal = cards[nextIdx];
nextIdx = curVal - 1;
}
--group;
++groupIdx;
}
if (group >= -2) {
return 0;
}
groups.sort((a, b) -> b - a);
return groups.get(0) * groups.get(1);
}
}
- DP 및 사이클탐색 이용하여 문제 풀이
DP 배열에는 각 그룹을 담고, groups 리스트에 그룹 인원을 기록
- 그룹이 하나면 0 반환
groups 를 내림차순으로 정렬하여 큰 값 2개 추출하여 곱셈 후 반환
- 코드 내에 불필요한 정보들과 비교적 복잡한 계산 부분이 존재하여, 명일 코드 최적화 진행 예정
- 최종 시간복잡도 : O(N * logN)
- 정렬 시간복잡도 : O(N * logN)
- 최종 시간복잡도 : O(N * logN)
💡 어려웠던 것 || 알게 된 것
레디스 최악의 사례 7가지