Closed baexxbin closed 2 weeks ago
O(N logN)
으로 풀이우선순위 큐
사용ArrayList<PriorityQueue<Integer>> arr = new ArrayList<>();
으로 각 학급을 조회할 수 있도록 자료구조 선택int[] {능력치, 학급}
을 저장 풀고 보니 투포인터,,?
=> O(N * M)까지 생각해보기
N, M <= 1,000 -> O(NM) = 10^6 이하로 생각
차이가 최소가 되는 경우
의 값을 출력 -> 투포인터
슬라이딩 윈도우
진행right++
)
능력치 차 구하기
후 왼쪽 선수 제거 (left++
)candi[right].ab-candi[left].ab
)
left
와 right
는 슬라이딩 윈도우의 성질로 서로 다른 값인게 보장 됨투포인터를 생각했으면 여기서 완전탐색으로 가지말고 슬라이딩윈도우 개념으로 향하기!!
PriorityQueue
O(N * M)
+ M개의 요소 정렬 O(M log M)
int[][] students
PriorityQueue<Student>
Math.min(result, max- student.power)
PriorityQueue
의 특징으로 능력치가 가장 작은 학생을 꺼내고가장 높은 능력치 - 가장 작은 능력치
차 계산++idxTable[student.index]
기존에 알고 있던 투포인터 문제(1차원 배열에서 특정값을 찾기)와 달랐어서 투포인터로 접근해야 하는지 전혀 몰랐어요! 투포인터로 문제를 풀진 않았지만, 결국에는 각 반을 1차원 배열로 봤을 때 포인터를 옮긴다는 부분에서 투포인터로 접근할 수 있는걸 알게 됐어요
연속적인 구간에서 최소/최대 값을 효율적으로 찾아야 할 때 투포인터 사용!
1 <= 학급의 수 <= 1,000
1 <= 학생의 수 <= 1,000
1,000 × 1,000 × 1,000
→ 시간 초과log(1,000) × 1,000 × 1,000 < 2억
int[][] arr
: 각 학급마다의 학생들의 능력치 저장PriorityQueue<Node> pq
: 능력치를 기준으로 정렬Node
: 학생의 능력치와 arr
에서의 행, 열 위치를 저장arr
를 행마다 정렬한 뒤, 우선순위큐를 통해 최댓값과 최솟값의 차이의 최소 구하기
pq
에 Node
추가하기pq.poll()