Algorithm

[μ•Œκ³ λ¦¬μ¦˜ μŠ€ν„°λ””] λ°±μ€€ #1417 κ΅­νšŒμ˜μ›

bba_dda 2020. 4. 11. 18:51
λ°˜μ‘ν˜•

[문제]

기호 1번으둜 μΆœλ§ˆν•œ λ‹€μ†œμ΄λŠ” μ„ κ±° 전에 후보별 λ“ν‘œμˆ˜λ₯Ό 미리 μ•Œ 수 μžˆλ‹€.

λ‹€μ†œμ΄λŠ” λ“ν‘œμˆ˜λ₯Ό 미리 μ•Œμ•„λ‚Έ ν›„, λ‹€λ₯Έ 후보λ₯Ό μ°λŠ” μ‚¬λžŒλ“€μ„ 돈으둜 λ§€μˆ˜ν•΄μ„œ μžμ‹ μ΄ λ‹Ήμ„ λ˜κ²Œ ν•˜λ €κ³  ν•œλ‹€.

λ‹€μ†œμ΄κ°€ λ§€μˆ˜ν•΄μ•Ό ν•  μ‚¬λžŒμ˜ μ΅œμ†Ÿκ°’μ„ ꡬ해라.

 

[Input]

N(ν›„λ³΄μ˜ 수)

λ‘˜μ§Έ 쀄 λΆ€ν„° 각 ν›„λ³΄μ˜ λ“ν‘œμˆ˜κ°€ N쀄에 κ±Έμ³μ„œ μž…λ ₯λœλ‹€.

 

[Output]

λ§€μˆ˜ν•΄μ•Ό ν•  μ‚¬λžŒμ˜ μ΅œμ†Ÿκ°’

 

[풀이]

완전탐색

μš°μ„  κ°€μž₯ 기본적인 λ°©λ²•μœΌλ‘œ μ ‘κ·Όν•΄λ³΄μž.

 

전체 ν›„λ³΄μ˜ λ“ν‘œμˆ˜κ°€ votesNum[] μ•ˆμ— 순차적으둜 μ €μž₯λ˜μ–΄ μžˆλ‹€κ³  ν•˜μž.

후보가 3λͺ…이고 각 ν›„λ³΄μ˜ μ˜ˆμƒ λ“ν‘œμˆ˜κ°€ 5,7,7μ΄μ—ˆλ‹€κ³  ν•˜μž.

voteNum[]μ—μ„œ max μœ„μΉ˜λ₯Ό κ΅¬ν•˜κ³ , λ‹€μ†œμ΄(기호 1번)κ°€ μ΅œλŒ“κ°’μ΄ 아닐 경우 

ν•΄λ‹Ή max μœ„μΉ˜μ—μ„œ 1을 λΉΌκ³ , κ·Έ ν‘œλ₯Ό λ‹€μ†œμ΄μ—κ²Œ 더해쀀닀.

μœ„ 과정을 λ°˜λ³΅ν•΄μ„œ λ‹€μ†œμ΄μ˜ ν‘œκ°€ maxν•˜λ‹€κ³  λ‚˜μ˜€λ©΄, loopλ₯Ό μ’…λ£Œν•˜κ³  μ§€κΈˆκΉŒμ§€ λŒμ•„κ°„ loop횟수λ₯Ό printν•΄μ£Όλ©΄ λœλ‹€.

 

κ·Έλ ‡λ‹€λ©΄, μ™„μ „νƒμƒ‰μœΌλ‘œ κ΅¬ν˜„ν–ˆμ„ λ•Œ μ œν•œμ‹œκ°„μ„ λ§Œμ‘±ν•  수 μžˆμ„κΉŒ?

N(ν›„λ³΄μžμ˜ 수)의 μ΅œλŒ“κ°’μ΄ 1000이고, 각 후보가 λ“ν‘œν•  수 μžˆλŠ” 수의 μ΅œλŒ“κ°’λ„ 1000이닀.

이런 μƒν™©μ—μ„œμ˜ μ΅œμ•…μ˜ κ²½μš°λŠ” μœ„μ˜ μ‚¬μ§„μ—μ„œμ™€ κ°™λ‹€.

결과적으둜 μ΅œμ•…μ˜ μƒν™©μ—μ„œλ„ 999번만 loopλ₯Ό 돌리면 output을 ꡬ할 수 있기 λ•Œλ¬Έμ— μ™„μ „νƒμƒ‰μœΌλ‘œ μΆ©λΆ„νžˆ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

** ν•œλ²ˆμ˜ loopμ—μ„œ μ΅œλŒ“κ°’μ„ ꡬ할 λ•Œ, N만큼의 λ³΅μž‘λ„κ°€ μΆ”κ°€λ‘œ μ†Œμš”λ˜μ–΄ μ΅œμ•…μ˜ λ°˜λ³΅νšŸμˆ˜λŠ” 1000*1000이닀.

ν•˜μ§€λ§Œ 이 값도 μ—¬μ „νžˆ 2μ΄ˆμ•ˆμ— μΆ©λΆ„νžˆ μˆ˜ν–‰ κ°€λŠ₯ν•˜λ‹€.

 

[μ½”λ“œ]

#include<stdio.h>
#include<algorithm>

using namespace std;

int main() {
	int voteNum[1001] = {0,}; //μ΅œλŒ€ ν›„λ³΄μž 수 1000λͺ…
	int N;
	scanf_s("%d",&N);
	for (int i = 0;i < N;i++) {
		scanf_s("%d", &voteNum[i]);
	}
	int M = 0;
	int maxCount = 0;
	for (int i = 0;i < N;i++) {
		if (voteNum[i] > voteNum[M])
			M = i;
		if (M == 0 && voteNum[i] == voteNum[M])
			M = i;
	}
	for (int i = 0;i < N;i++) {
		if (voteNum[i] == voteNum[M])
			maxCount++;
	}
	int count=0;
	while (M != 0 || maxCount > 1) {
		count++;
		voteNum[M]--;
		voteNum[0]++;
		M = 0;
		maxCount = 0;
		for (int i = 0;i < N;i++) {
			if (voteNum[i] > voteNum[M])
				M = i;
			if (M == 0 && voteNum[i] == voteNum[M])
				M = i;
		}
		for (int i = 0;i < N;i++) {
			if (voteNum[i] == voteNum[M])
				maxCount++;
		}
	}
	printf("%d", count);
}

 

M은 μ΅œλŒ“κ°’μ˜ 인덱슀

maxCountλŠ” μ΅œλŒ“κ°’μ˜ 수 λ₯Ό λ‹΄λŠ” λ³€μˆ˜μ΄λ‹€.

while의 쑰건을 보면, M이 0(λ‹€μ†œμ΄κ°€ 1λ“±)이어도 maxCountκ°€ 1 이상이라면 λ™μ μžκ°€ μžˆλ‹€λŠ” 뜻이기 λ•Œλ¬Έμ— maxCount에 λŒ€ν•œ 쑰건도 μΆ”κ°€ν•΄μ£Όμ—ˆλ‹€. 

 

[제좜결과]

λ°˜μ‘ν˜•