백준 문제/문자열,누적합,구현

1296: 팀 이름 정하기

goldpig 2024. 3. 31. 21:52
728x90

 

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

 

1296번: 팀 이름 정하기

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

www.acmicpc.net

설명

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

이환이가 만든 공식은 사용하려면 먼저 다음 4가지 변수의 값을 계산해야 한다.

  • L = 연두의 이름과 팀 이름에서 등장하는 L의 개수
  • O = 연두의 이름과 팀 이름에서 등장하는 O의 개수
  • V = 연두의 이름과 팀 이름에서 등장하는 V의 개수
  • E = 연두의 이름과 팀 이름에서 등장하는 E의 개수

그 다음, 위에서 구한 변수를 다음 식에 입력하면 팀 이름의 우승할 확률을 구할 수 있다.

((L+O) × (L+V) × (L+E) × (O+V) × (O+E) × (V+E)) mod 100

연두의 영어 이름과 팀 이름 후보 N개가 주어졌을 때, 우승할 확률이 가장 높은 팀 이름을 구해보자. 확률이 가장 높은 팀이 여러가지인 경우 사전 순으로 가장 앞서는 팀 이름이 우승할 확률이 가장 높은 것이다.

핵심 아이디어

  • 주어진 조건대로 구현하면 되는 문제다.
  • mod == %

코드 구현

Python


# 연두의 영어 이름
name = input().upper()
# 팀 이름 후보 수
n = int(input())
# 팀 이름을 저장할 배열
team_list = []

for _ in range(n):
	team_name = input().upper()
	team_list.append(team_name)
team_list.sort() # 사전 순 정렬
# 확률값을 저장할 배열
result = []
for i in range(n):
	# L O V E의 각각의 개수를 찾자.
	L = name.count("L") + team_list[i].count("L")
	O = name.count("O") + team_list[i].count("O")
	V = name.count("V") + team_list[i].count("V")
	E = name.count("E") + team_list[i].count("E")
	# 공식
	p = ((L+O)*(L+V)*(L+E)*(O+V)*(O+E)*(V+E)) % 100
	result.append(p)

# 우승 확률이 가장 높은 팀 이름 출력
print(team_list[result.index(max(result))].upper())

C++

#include <iostream>
#include <algorithm>
using namespace std;

int max_value = 0;
int max_index;
string team_list[50];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	string name;
	cin >> name;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> team_list[i];
	}
	sort(team_list, team_list + n);
	for (int i = 0; i < n; i++) {

		string temp = ""; // 이름 + 팀 이름 저장할 변수
		int L = 0, O = 0, V = 0, E = 0;
		temp = name + team_list[i];
		for (int i = 0; i < temp.size(); i++) {

			if (temp[i] == 'L') L++;
			else if (temp[i] == 'O') O++;
			else if (temp[i] == 'V') V++;
			else if (temp[i] == 'E') E++;
		}
		if (max_value < ((L + O) * (L + V) * (L + E) * (O + V) * (O + E) * (V + E)) % 100) {
			max_value = ((L + O) * (L + V) * (L + E) * (O + V) * (O + E) * (V + E)) % 100;
			max_index = i;
		}
	}
	
	cout << team_list[max_index] << "\n";
}
728x90