문제 풀이/C#

[11286] - 절댓값 힙

Chamber 2022. 11. 9. 17:33

https://www.acmicpc.net/problem/11286

 

11286번: 절댓값 힙

첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0

www.acmicpc.net

접근 방법

1. 우선순위 큐에 절댓값을 씌워서 넣어주면 되는거 아닌가? -> 틀림 - 정렬이 되지 않아서

2. 사전으로 키를 절댓값 우선순위, 값을 리스트로 정렬해서 넣어주고 출력 -> 시간초과

3. 도저히 정렬 방법이 떠오르지 않아서 음수와 양수 우선순위 큐 2개 만듬 -> 성공

 

문제 풀이

정렬 방법이 떠오르지 않아 우선순위 큐 두개를 만들어서 풀었다.

  • 입력이 0이 아니면 - 들어온 숫자의 부호에 맞게 양수, 음수 큐에 넣는데, priority는 양수로 넣어줌
  • 입력이 0이면 - 일단 두 큐의 개수 확인
  • 둘다 큐에 든게 있으면 두개의 peek를 비교하여 절댓값이 더 작은거 deque-출력
  • 음수큐에만 든게 있으면 음수 큐 deque-출력
  • 양수큐에만 든게 있으면 양수 큐 deque-출력
  • 두 큐가 비었으면 0 출력

피드백

도무지 같은 우선순위 내 값을 정렬할 방법이 떠오르지 않았다. 다른 사람들의 풀이를 보니 우선순위^2에 음수면 -1, 양수면 그대로 두어서 푸는 방법이 있다는 것을 알게 되었다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Baekjoon.silver
{
    class _11286
    {
        static void Main(string[] args)
        {
            StringBuilder stb = new StringBuilder();
            int n = int.Parse(Console.ReadLine());
            //양수
            PriorityQueue<int,int> plus = new PriorityQueue<int,int>();
            //음수
            PriorityQueue<int,int> minus = new PriorityQueue<int,int>();

            for(int i = 0; i<n; i++)
            {
                int num = int.Parse(Console.ReadLine());

                if(num == 0)
                {
               		//양,음 둘다 값이 있으면
                    if (minus.Count > 0 && plus.Count > 0)
                    {
                    	//음수의 절댓값이 더 크면 양수꺼 출력
                        if (Math.Abs(minus.Peek()) > Math.Abs(plus.Peek()))
                            stb.AppendLine(plus.Dequeue().ToString());
                        //아니면 음수꺼 출력
                        else
                            stb.AppendLine(minus.Dequeue().ToString());
                    }
                    //음수만 값이 있으면 음수꺼 출력
                    else if (minus.Count > 0)
                        stb.AppendLine(minus.Dequeue().ToString());
                    //양수만 값이 있으면 양수꺼 출력
                    else if (plus.Count > 0)
                        stb.AppendLine(plus.Dequeue().ToString());
                    //둘다 없으면 0 출력
                    else
                        stb.AppendLine("0");
                }
                else
                {
                	//양수면 양수에, 음수면 음수에 넣기
                    if (num > 0)
                        plus.Enqueue(num, num);
                    else
                        minus.Enqueue(num, Math.Abs(num));
                }
            }

            Console.WriteLine(stb);
        }
    }
}