Algorithm/boj
11286번: 절대값 힙
Mini_96
2022. 8. 12. 09:51
https://www.acmicpc.net/problem/11286
11286번: 절댓값 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
if(입력!=0)
add(입력>0) (절대값,+1)
add(입력<0) (절대값,-1)
if(입력==0)
if(빔) 0출력
if(안빔) 우선순위큐는 자동정렬-> top에있는거 출력
-add
큐에 배열을 (절대값, 1) (절대값, -1)로 넣음 => 곱하면 원래값이 나오도록
-comparator
절대값이 같으면 -> 오리지날 값끼리 비교 -> 작은거 위로
절대값이 다르면-> 절대값끼리 비교 -> 작은거 위로
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main_11286_유동훈 {
static int N;
static PriorityQueue<int[]> q = new PriorityQueue<>(new Comparator<int[]>()
{
@Override
public int compare(int[] o1, int[] o2) {
// TODO Auto-generated method stub
if(Math.abs(o1[0])==Math.abs(o2[0])) return o1[0]*o1[1]-o2[0]*o2[1];
return Math.abs(o1[0])-Math.abs(o2[0]);
}
});
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
StringTokenizer st;
//st = new StringTokenizer(br.readLine());
StringBuilder sb= new StringBuilder();
for(int i=0;i<N;++i)
{
int input=Integer.parseInt(br.readLine());
if(input!=0)
{
if(input>0)
{
q.add(new int[] {Math.abs(input),1});
}
else
{
q.add(new int[] {Math.abs(input),-1});
}
}
else
{
if(q.isEmpty())
sb.append(0+"\n");
else
{
sb.append(q.peek()[0]*q.poll()[1]+"\n");
}
}
}
System.out.println(sb);
}
}