hyelie
hyelie
Hyeil Jeong
       
글쓰기    관리    수식입력
  • 전체보기 (495)
    • PS (283)
      • Algorithm (28)
      • PS Log (244)
      • Contest (6)
      • Tips (5)
    • Development (52)
      • Java (14)
      • Spring (23)
      • SQL (2)
      • Node.js (2)
      • Socket.io (3)
      • Study (4)
      • Utils (4)
    • DevOps (36)
      • Git (5)
      • Docker (4)
      • Kubernetes (2)
      • GCP (3)
      • Environment Set Up (8)
      • Tutorial (12)
      • Figma (2)
    • CS (74)
      • OOP (7)
      • OS (24)
      • DB (2)
      • Network (24)
      • Architecture (0)
      • Security (2)
      • Software Design (0)
      • Parallel Computing (15)
    • Project (15)
      • Project N2T (5)
      • Project ASG (0)
      • Project Meerkat (1)
      • Model Checking (7)
      • Ideas (2)
    • 내가 하고싶은 것! (34)
      • Plan (16)
      • Software Maestro (10)
      • 취준 (8)
hELLO · Designed By 정상우.
hyelie

hyelie

PS/PS Log

22.08.04. 풀었던 문제들

LIS 5 문제에 LIS 정리를 해 뒀고
pq 정렬 기준에 대한 정리도 해야 함(pq 첫 문제에 정리 해 둠)

 

22 binary search

12015 LIS 2
12738 LIS 3
14002 LIS 4
14003 LIS 5

 

23 priority queue

11279 최대 힙
1927 최소 힙
11286 절댓값 힙

1655 가운데를 말해요

 상당히 재밌는 문제였다. pq 2개를 써서 가운데 값을 표현할 수 있다.

 [max heap] - middle value - [min heap]으로. 그러나 수가 짝수 개, 홀수 개일 때 middle value를 수정하는 것이 번거롭기 때문에 수가 짝수일 때는 max heap과 min heap의 크기를 동일하게 유지해서 max heap의 top을 middle value로 생각하고, 수가 홀수일 때는 max heap size == min heap size + 1로 유지해서 max heap의 top을 middle value로 일관성 있게 생각할 수 있게 두면 된다.

 input과 middle value를 비교해서 min heap에 넣을지, max heap에 넣을지 결정하고, 항상 [min heap size <= max heap size <= min heap size + 1]이라는 전제를 유지하기 위해 size가 2 이상 차이나면 그것을 없애주는 로직을 넣고, 항상 middle은 max heap top이라는 것을 인지하면 쉽게 풀 수 있다.

int N; cin>>N;

int input; cin>>input;
int mid = input; cout<<mid<<'\n';
priority_queue<int, vector<int>, less<int>> maxh; maxh.push(input);
priority_queue<int, vector<int>, greater<int>> minh;

for(int i = 2; i<=N; i++){
	cin>>input;
	if(input < mid){ // max heap에 값 넣어야 하는 경우
		maxh.push(input);
	}
	else{ // min heap에 값 넣어야 하는 경우
		minh.push(input);
	}

	// size를 맞춰 주어야 함. max heap과 min heap의 차이가 최대 1 나게
	// 같다면 max heap쪽으로 몰아 줌
	if(maxh.size() > minh.size() + 1){
		minh.push(maxh.top());
		maxh.pop();
	}
	if(minh.size() >= maxh.size() + 1){
		maxh.push(minh.top());
		minh.pop();
	}
	mid = maxh.top();
	cout<<mid<<'\n';
}

'PS > PS Log' 카테고리의 다른 글

22.08.06. 풀었던 문제들  (0) 2022.08.06
22.08.05. 풀었던 문제들 - Codeforces #811 Div. 3 4/7  (0) 2022.08.05
22.08.03. 풀었던 문제들  (0) 2022.08.03
22.07.14. 풀었던 문제들  (0) 2022.07.13
22.07.13. 풀었던 문제들  (0) 2022.07.13
    hyelie
    hyelie

    티스토리툴바