본문 바로가기

Coding

[C++]백준 11286번: 절댓값 힙

728x90
문제

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

 

11286번: 절댓값 힙

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

www.acmicpc.net

 

문제이해

 

  • 첫째 줄에 연산의 개수(N)를 입력합니다.
  • N개의 줄에 대해 연산의 정보(x)를 입력합니다.
  • 입력에서 0이 입력된 수만큼 답을 출력합니다.

절댓값을 기준으로 정렬된 힙을 만들기 위해서는 당연히 절댓값을 기준으로 정렬한 우선순위 큐(priority_queue)를 사용하여야 합니다. 주의해야 할 점이 있다면 절댓값이 같고 부호가 다른 수에 대해서는 음수가 우선순위가 더 높게 하여야 합니다. 또한 수의 범위가 int로는 전부다 포함하지 못하기 때문에 long long 타입을 사용하여야 합니다.

 

 

다음은 위의 설명대로 만든 코드입니다.

문제풀이
#include <iostream>
#include <queue>
using namespace std;

struct absAscending
{
	bool operator()(const long long& a, const long long& b) const {
		long long absA = abs(a);
		long long absB = abs(b);

		if (absA != absB) {
			return absA > absB;
		}
		else {
			return a > b;
		}
	}
};

priority_queue<long long, vector<long long>, absAscending> test;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int N;
	long long C;
	cin >> N;
	while(N--) {
		cin >> C;
		if (C != 0)
			test.push(C);
		else {
			if (test.size() == 0)
				cout << "0\n";
			else {
				cout << test.top() << "\n";
				test.pop();
			}
		}
	}
}

 

문제후기

정렬 기준만 잘 세워준다면 어렵지 않은 문제였습니다.

728x90

'Coding' 카테고리의 다른 글

[C++]백준 11727번: 2xn 타일링 2  (0) 2023.08.02
[C++]백준 11726번: 2xn 타일링  (0) 2023.08.01
[C++]백준 1422번: 숫자의 신  (0) 2023.07.27
[C++]백준 17070번: 파이프 옮기기 1  (0) 2023.07.25
[C++]백준 2178번: 미로 탐색  (0) 2023.07.21