배운 점
- getOrDefault(Object key, V DefaultValue)
- 반환 값 : 찾는 key가 존재하면 해당 key에 매핑되어 있는 값을 반환하고, 그렇지 않으면 디폴트 값이 반환
- map.keySet().stream().collect(Collectors.toList());
- 이분 탐색 (백준 참고)
- 결정 문제(Decision Problem)의 답이 이분적일 때 사용할 수 있는 탐색 기법
-> 결정 문제란 답이 Yes or No인 문제를 의미하며 (이분 탐색 문제에서는) 보통 1개의 parameter를 가진다.
-> 결정 문제의 답이 두 구간으로 나뉘는 것을 "이분적이다"라고 하며 이런 경우 이분 탐색을 사용해 결정 문제의 답이 달라지는 경계를 찾을 수 있다.
- 경계를 포함하는 구간 [lo, hi]을 잡은 뒤 구간의 길이를 절반씩 줄여나가며 lo, hi이 경계 지점에 위치하도록 하는 것
-> 구간의 범위가 클 때 특히 효과적
많은 최적화 문제는 이분 탐색으로 풀 수 있다.
-> 최적화 문제란 어떤 조건(Check(x))을 만족하는 x의 최댓값 또는 최솟값을 찾는 문제
구현 방법
- Check(lo) != Check(hi)가 되도록 lo, hi의 초기값을 잘 설정
- lo + 1 < hi인 동안 mid = (lo + hi) / 2를 구함
- Check(lo) == Check(mid)라면 lo = mid를, Check(hi) == Check(mid)라면 hi = mid
lo + 1 == high 가 되면 탈출
- 슬라이딩 윈도우
- 창문을 열고 닫듯이 (미닫이 방식) 배열의 값을 하나씩 옮기는 방식
- 예를 들어 크기가 5인 배열에서 순서대로 3개 배열의 합을 구하고자 한다면 0 + 1 + 2 -> 1 + 2 + 3의 순서대로 합들이 생겨날 텐데, 이때 2번째 배열은 arr[0]을 빼고 arr[next]를 더한 것과 같다.
- custom annotation
- 어노테이션은 다음과 같이 인터페이스 앞에 @를 붙여서 생성할 수 있다.
- Target: 해당 어노테이션이 사용되는 위치를 결정
-> ElementType.TYPE_PARAMETER로 지정했으니 매개 변수 타입 선언시 사용하겠다.
-> METHOD, CLASS등의 다양한 방식이 존재한다.
- Retention: 해당 어노테이션의 정보를 어느 범위까지 유지할 것인지
-> RetentionPolicy.RUNTIME을 사용해서 런타임시 계속 사용하겠다.
- XOR 연산
- 배타적 논리합(exclusive OR)
- 두 개의 피연산자 중 하나만이 1일 때 1을 반환
- 기호 : ^ => A ^ B
느낀 점
- 우선은 제발 건강했으면 좋겠다. 조금 조금씩 운동을 해나가야겠다...
- 공부시간도 조금 늘리는 방향으로 잡아야겠다.
- 공부를 집중할 수 있는 기간이 짧아서 차라리 휴식을 잡고 시간을 늘리는 방식으로 해야겠다.