본문 바로가기
알고리즘 (C++)

[백준]1296번: 팀 이름 정하기

by Dev_Hugh 2023. 12. 13.
728x90
반응형

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

 

1296번: 팀 이름 정하기

연두는 프로그래밍 대회에 나갈 팀 이름을 정하려고 한다. 미신을 믿는 연두는 이환이에게 공식을 하나 받아왔고, 이 공식을 이용해 우승할 확률이 가장 높은 팀 이름을 찾으려고 한다. 이환

www.acmicpc.net

 

푸는데 나름 재밌는 문제였어서 풀이를 올리려 합니다.

 

접근 아이디어는 다음과 같습니다.

1) vector<pair<int,string>>를 통해 (이길 확률, 팀명)을 저장 받습니다. 또한 loveArry를 통해 LOVE 순서대로 개수를 카운팅 한다.
2) LOVE를 개수를 연두 이름과 팀명을 받아 카운팅 해주는 CountLove 함수를 선언한다.
3) 카운팅 된 값을 기준으로 확률을 연산하여 pair의 first값에 해당 팀명에 맞춰 저장한다
4) 해당 팀명과 이길 확률 계산이 끝났으면 다음 팀 계산을 위해 fill(arr, arr+n, 0)을 통해 love를 카운팅한 배열을 초기화

#include<iostream>
#include<vector>
#include<algorithm>

#define FastIO ios::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL);

using namespace std;

int loveArry[4] = { 0, }; // 순서대로 LOVE 개수

void CountLove(string name, string teamName)
{
	for (int i = 0; i < name.size(); i++)
	{
		switch (name[i])
		{
		case 'L':
			loveArry[0]++;
			break;
		case 'O':
			loveArry[1]++;
			break;
		case 'V':
			loveArry[2]++;
			break;
		case 'E':
			loveArry[3]++;
			break;
		}
	}

	for (int i = 0; i < teamName.size(); i++)
	{
		switch (teamName[i])
		{
		case 'L':
			loveArry[0]++;
			break;
		case 'O':
			loveArry[1]++;
			break;
		case 'V':
			loveArry[2]++;
			break;
		case 'E':
			loveArry[3]++;
			break;
		}
	}
}

int CalWinPercent()
{
	return (loveArry[0] + loveArry[1]) * (loveArry[0] + loveArry[2]) * (loveArry[0] + loveArry[3]) * (loveArry[1] + loveArry[2]) * (loveArry[1] + loveArry[3]) * (loveArry[2] + loveArry[3]) % 100;
}


bool Compare(const pair<int, string>& a, const pair<int, string>& b)
{
	if (a.first == b.first)
		return a.second < b.second;
	return a.first > b.first;
}


int main(void)
{
	FastIO;
	
	int N = 0; // 팀 이름 후보 N개
	string name;

	cin >> name;
	cin >> N;
	vector<pair<int, string>> team;
	for (int i = 0; i < N; i++)
	{
		string input;
		cin >> input;
		team.push_back(make_pair(-1, input));
	}

	for (int i = 0; i < N; i++)
	{
		CountLove(name, team[i].second);
		team[i].first = CalWinPercent();
		fill(loveArry, loveArry + 4, 0);
	}

	sort(team.begin(), team.end(), Compare);
	cout << team[0].second << "\n";
	return 0;
}
728x90
반응형