Algorithm/λ¬Έμ œν’€μ΄

[λ°±μ€€] 11286번 - μ ˆλŒ“κ°’ νž™ (C++)

moaoh 2023. 8. 21. 22:17

 

11286번: μ ˆλŒ“κ°’ νž™

첫째 쀄에 μ—°μ‚°μ˜ 개수 N(1≤N≤100,000)이 μ£Όμ–΄μ§„λ‹€. λ‹€μŒ N개의 μ€„μ—λŠ” 연산에 λŒ€ν•œ 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ xκ°€ μ£Όμ–΄μ§„λ‹€. λ§Œμ•½ xκ°€ 0이 μ•„λ‹ˆλΌλ©΄ λ°°μ—΄μ— xλΌλŠ” 값을 λ„£λŠ”(μΆ”κ°€ν•˜λŠ”) 연산이고, xκ°€ 0

www.acmicpc.net

 

문제

μ ˆλŒ“κ°’ νž™μ€ λ‹€μŒκ³Ό 같은 연산을 μ§€μ›ν•˜λŠ” μžλ£Œκ΅¬μ‘°μ΄λ‹€.

  1. 배열에 μ •μˆ˜ x (x ≠ 0)λ₯Ό λ„£λŠ”λ‹€.
  2. λ°°μ—΄μ—μ„œ μ ˆλŒ“κ°’μ΄ κ°€μž₯ μž‘μ€ 값을 좜λ ₯ν•˜κ³ , κ·Έ 값을 λ°°μ—΄μ—μ„œ μ œκ±°ν•œλ‹€. μ ˆλŒ“κ°’μ΄ κ°€μž₯ μž‘μ€ 값이 μ—¬λŸ¬κ°œμΌ λ•ŒλŠ”, κ°€μž₯ μž‘μ€ 수λ₯Ό 좜λ ₯ν•˜κ³ , κ·Έ 값을 λ°°μ—΄μ—μ„œ μ œκ±°ν•œλ‹€.

ν”„λ‘œκ·Έλž¨μ€ μ²˜μŒμ— λΉ„μ–΄μžˆλŠ” λ°°μ—΄μ—μ„œ μ‹œμž‘ν•˜κ²Œ λœλ‹€.

 

 

 

μž…λ ₯

첫째 쀄에 μ—°μ‚°μ˜ 개수 N(1≤N≤100,000)이 μ£Όμ–΄μ§„λ‹€. λ‹€μŒ N개의 μ€„μ—λŠ” 연산에 λŒ€ν•œ 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ xκ°€ μ£Όμ–΄μ§„λ‹€. λ§Œμ•½ xκ°€ 0이 μ•„λ‹ˆλΌλ©΄ λ°°μ—΄μ— xλΌλŠ” 값을 λ„£λŠ”(μΆ”κ°€ν•˜λŠ”) 연산이고, xκ°€ 0이라면 λ°°μ—΄μ—μ„œ μ ˆλŒ“κ°’μ΄ κ°€μž₯ μž‘μ€ 값을 좜λ ₯ν•˜κ³  κ·Έ 값을 λ°°μ—΄μ—μ„œ μ œκ±°ν•˜λŠ” κ²½μš°μ΄λ‹€. μž…λ ₯λ˜λŠ” μ •μˆ˜λŠ” -231보닀 크고, 231보닀 μž‘λ‹€.

 

 

 

좜λ ₯

μž…λ ₯μ—μ„œ 0이 μ£Όμ–΄μ§„ 회수만큼 닡을 좜λ ₯ν•œλ‹€. λ§Œμ•½ 배열이 λΉ„μ–΄ μžˆλŠ” 경우인데 μ ˆλŒ“κ°’μ΄ κ°€μž₯ μž‘μ€ 값을 좜λ ₯ν•˜λΌκ³  ν•œ κ²½μš°μ—λŠ” 0을 좜λ ₯ν•˜λ©΄ λœλ‹€.

 

 

풀이과정

ν•΄λ‹Ή 문제λ₯Ό μ–΄λ–»κ²Œ μ ‘κ·Όν• κΉŒ 고민을 ν•˜λ‹€κ°€ μš°μ„ μˆœμœ„ 큐λ₯Ό μŒμˆ˜λ²„μ „κ³Ό μ–‘μˆ˜λ²„μ „ 2개둜 λ‚˜λˆ„μ–΄μ„œ 풀이λ₯Ό μ§„ν–‰ν•˜μ˜€λ‹€.

κ·Έλƒ₯ λ“€μ–΄μ˜€λŠ” κ°’ μžμ²΄μ— μ ˆλŒ€κ°’μ„ μ”Œμ›Œλ²„λ¦¬λ©΄ 이 값이 μ›λž˜ μ–‘μˆ˜μ˜€λŠ”μ§€ μŒμˆ˜μ˜€λŠ”μ§€ 확인할 방법을 λͺ¨λ₯΄κ² μ–΄μ„œ κ·Έλ ‡κ²Œ 진행을 ν•˜μ˜€λ‹€.

 

std::greater : λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬ ( κΈ°λ³Έν˜•, 큰값이 μ•žμ— μ˜€λŠ” 방식 4, 3, 2, 1 ... )

std::less : μ˜€λ¦„μ°¨μˆœ μ •λ ¬ ( μž‘μ€ 값이 μ•žμ—μ˜€λŠ” 방식 1, 2, 3, 4 ... )

 

ν˜•μ‹μœΌλ‘œ 정리λ₯Ό ν•˜κ³  μ ˆλŒ€κ°’μ΄ μž‘μ€ 값을 λ¨Όμ € 좜λ ₯을 ν•΄μ€˜μ•Όν•˜κΈ°λ•Œλ¬Έμ—  μŒμˆ˜μ—λŠ” μ ˆλŒ€κ°’μ„ μ”Œμ›Œ μ–‘μˆ˜μ™€ λΉ„κ΅ν•˜μ—¬ μž‘μ€ 값을 좜λ ₯ν•΄μ£ΌλŠ” λ°©μ‹μœΌλ‘œ μ½”λ“œλ₯Ό μ§„ν–‰ν•˜μ˜€λ‹€.

 

code

#include <iostream>
#include <algorithm>
#include <queue>

int		main(void)
{
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);

	int n, temp;
	std::priority_queue <int, std::vector<int>, std::greater<int> > plusQue;
	std::priority_queue <int, std::vector<int>, std::less<int> > minusQue;
	
	std::cin >> n;
	for (int i = 0; i < n; i++)
	{
		std::cin >> temp;
		if (temp == 0)
		{
			if (plusQue.empty() && minusQue.empty()) {
				std::cout << "0" << "\n";
			}
			else {
				if (!plusQue.empty() && minusQue.empty()) {
					std::cout << plusQue.top() << "\n";
					plusQue.pop();
				}
				else if (plusQue.empty() && !minusQue.empty()) {
					std::cout << minusQue.top() << "\n";
					minusQue.pop();
				}
				else if (plusQue.top() < -minusQue.top()) {
					std::cout << plusQue.top() << "\n";
					plusQue.pop();
				}
				else {
					std::cout << minusQue.top() << "\n";
					minusQue.pop();
				}
			}
		}
		else 
		{
			if (temp < 0) minusQue.push(temp);
			else plusQue.push(temp);
		}
	}

	return (0);
}

 

ν›„κΈ°

μ‘°κ±΄μ‹μ—μ„œ μ‹ κ²½μ“°κ³  생각할 뢀뢄듀을 생각보닀 λ§Žμ•„μ„œ λ‚˜λ¦„ 고전을 많이 ν–ˆμ—ˆλ˜ κ±° κ°™λ‹€.