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

[λ°±μ€€] 1417번 - κ΅­νšŒμ˜μ› μ„ κ±° (C++)

moaoh 2023. 8. 20. 23:35

 

1417번: κ΅­νšŒμ˜μ› μ„ κ±°

첫째 쀄에 ν›„λ³΄μ˜ 수 N이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ 쀄뢀터 μ°¨λ‘€λŒ€λ‘œ 기호 1λ²ˆμ„ 찍으렀고 ν•˜λŠ” μ‚¬λžŒμ˜ 수, 기호 2λ²ˆμ„ 찍으렀고 ν•˜λŠ” 수, μ΄λ ‡κ²Œ 총 N개의 쀄에 걸쳐 μž…λ ₯이 λ“€μ–΄μ˜¨λ‹€. N은 50보닀 μž‘κ±°λ‚˜ κ°™

www.acmicpc.net

 

 

문제

λ‹€μ†œμ΄λŠ” μ‚¬λžŒμ˜ λ§ˆμŒμ„ 읽을 수 μžˆλŠ” 기계λ₯Ό κ°€μ§€κ³  μžˆλ‹€. λ‹€μ†œμ΄λŠ” 이 기계λ₯Ό μ΄μš©ν•΄μ„œ 2008λ…„ 4μ›” 9일 κ΅­νšŒμ˜μ› μ„ κ±°λ₯Ό μ‘°μž‘ν•˜λ €κ³  ν•œλ‹€.

λ‹€μ†œμ΄μ˜ κΈ°κ³„λŠ” 각 μ‚¬λžŒλ“€μ΄ λˆ„κ΅¬λ₯Ό 찍을 μ§€ 미리 읽을 수 μžˆλ‹€. μ–΄λ–€ μ‚¬λžŒμ΄ λˆ„κ΅¬λ₯Ό 찍을 μ§€ μ •ν–ˆμœΌλ©΄, λ°˜λ“œμ‹œ μ„ κ±°λ•Œ κ·Έ μ‚¬λžŒμ„ μ°λŠ”λ‹€.

ν˜„μž¬ ν˜•νƒκ΅¬μ— λ‚˜μ˜¨ κ΅­νšŒμ˜μ› ν›„λ³΄λŠ” Nλͺ…이닀. λ‹€μ†œμ΄λŠ” 이 기계λ₯Ό μ΄μš©ν•΄μ„œ κ·Έ λ§ˆμ„μ˜ μ£Όλ―Ό Mλͺ…μ˜ λ§ˆμŒμ„ λͺ¨λ‘ μ½μ—ˆλ‹€.

λ‹€μ†œμ΄λŠ” 기호 1λ²ˆμ΄λ‹€. λ‹€μ†œμ΄λŠ” μ‚¬λžŒλ“€μ˜ λ§ˆμŒμ„ μ½μ–΄μ„œ μžμ‹ μ„ 찍지 μ•ŠμœΌλ €λŠ” μ‚¬λžŒμ„ 돈으둜 λ§€μˆ˜ν•΄μ„œ κ΅­νšŒμ˜μ›μ— 당선이 되게 ν•˜λ €κ³  ν•œλ‹€. λ‹€λ₯Έ λͺ¨λ“  μ‚¬λžŒμ˜ λ“ν‘œμˆ˜ λ³΄λ‹€ λ§Žμ€ λ“ν‘œμˆ˜λ₯Ό κ°€μ§ˆ λ•Œ, κ·Έ μ‚¬λžŒμ΄ κ΅­νšŒμ˜μ›μ— λ‹Ήμ„ λœλ‹€.

예λ₯Ό λ“€μ–΄μ„œ, λ§ˆμŒμ„ 읽은 κ²°κ³Ό κΈ°ν˜Έ 1번이 5ν‘œ, 기호 2번이 7ν‘œ, 기호 3번이 7ν‘œ 라고 ν•œλ‹€λ©΄, λ‹€μ†œμ΄λŠ” 2번 후보λ₯Ό 찍으렀고 ν•˜λ˜ μ‚¬λžŒ 1λͺ…κ³Ό, 3번 후보λ₯Ό 찍으렀고 ν•˜λ˜ μ‚¬λžŒ 1λͺ…을 돈으둜 λ§€μˆ˜ν•˜λ©΄, κ΅­νšŒμ˜μ›μ— 당선이 λœλ‹€.

돈으둜 λ§€μˆ˜ν•œ μ‚¬λžŒμ€ λ°˜λ“œμ‹œ λ‹€μ†œμ΄λ₯Ό μ°λŠ”λ‹€κ³  κ°€μ •ν•œλ‹€.

λ‹€μ†œμ΄κ°€ λ§€μˆ˜ν•΄μ•Όν•˜λŠ” μ‚¬λžŒμ˜ μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

 

 

μž…λ ₯

첫째 쀄에 ν›„λ³΄μ˜ 수 N이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ 쀄뢀터 μ°¨λ‘€λŒ€λ‘œ 기호 1λ²ˆμ„ 찍으렀고 ν•˜λŠ” μ‚¬λžŒμ˜ 수, 기호 2λ²ˆμ„ 찍으렀고 ν•˜λŠ” 수, μ΄λ ‡κ²Œ 총 N개의 쀄에 걸쳐 μž…λ ₯이 λ“€μ–΄μ˜¨λ‹€. N은 50보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄κ³ , λ“ν‘œμˆ˜λŠ” 100보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

 

 

 

좜λ ₯

첫째 쀄에 λ‹€μ†œμ΄κ°€ λ§€μˆ˜ν•΄μ•Ό ν•˜λŠ” μ‚¬λžŒμ˜ μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

 

풀이과정

λͺ¨λ“  μ‚¬λžŒλ“€μ„ 제치고 λ‹€μ†œμ΄κ°€ ν‘œλ₯Ό κ°€μž₯ 많이 λ°›μ•„ 당선이 λ˜μ–΄μ•Όν•˜λŠ” λ¬Έμ œμ˜€λ‹€,

priority_queue (μš°μ„ μˆœμœ„ 큐) λΌλŠ” κ°œλ…μ΄ μ‚¬μš©μ΄ λ˜μ—ˆλŠ”λ° μš°μ„ μˆœμœ„ νλž€ λ“€μ–΄μ˜¨ μž…λ ₯값듀을 큰 κ°’μˆœμœΌλ‘œ 정렬을 ν•΄μ£ΌλŠ” ν˜•μ‹μ΄μ—ˆλ‹€.

예λ₯Ό λ“€μ–΄ 4, 6, 3, 10 순으둜 μž…λ ₯값이 λ“€μ–΄μ˜¨λ‹€λ©΄ κ·Έλƒ₯ νλŠ” pop이 4, 6, 3, 10 μ΄μ—ˆκ² μ§€λ§Œ μš°μ„ μˆœμœ„ νμ—μ„œλŠ” pop의 μˆœμ„œκ°€ 10, 6, 4, 3 으둜 큰값을 κΈ°μ€€μœΌλ‘œ pop이 이루어진닀.

 

ν•΄λ‹Ή κ°œλ…μ„ μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  μ‚¬λžŒλ“€μ„ 제치고 λ‹€μ†œμ΄κ°€ 당선이 되면 λœλ‹€.

 

code

#include <iostream>
#include <queue>

int		main(void)
{
	int	n, dasom, temp, count = 0;
	std::priority_queue <int> que;

	std::cin >> n;
	std::cin >> dasom;
	for (int i = 0; i < n - 1; i++)
	{
		std::cin >> temp;
		que.push(temp);
	}

	while (!que.empty())
	{
		temp = que.top();
		if (dasom <= temp) {
			temp--;
			dasom++;
			count++;
			que.pop();
			que.push(temp);
		}
		else
			que.pop();
	}
	std::cout << count << "\n";

	return (0);
}

 

ν›„κΈ°

μžλ£Œκ΅¬μ‘°λŠ” λ¬Έμ œμ— λ”°λΌμ„œ λ‹€μ–‘ν•œ 자료ꡬ쑰(큐, μŠ€νƒ λ°°μ—΄ λ“±λ“±)λ₯Ό μ‚¬μš©ν•΄μ•Όν•˜λŠ” κ±° κ°™λ‹€.