Baekjoon Online Judge
문제
연두는 프로그래밍 대회에 나갈 팀 이름을 정하려고 한다. 미신을 믿는 연두는 이환이에게 공식을 하나 받아왔고, 이 공식을 이용해 우승할 확률이 가장 높은 팀 이름을 찾으려고 한다.
이환이가 만든 공식은 사용하려면 먼저 다음 4가지 변수의 값을 계산해야 한다.
- L = 연두의 이름과 팀 이름에서 등장하는 L의 개수
- O = 연두의 이름과 팀 이름에서 등장하는 O의 개수
- V = 연두의 이름과 팀 이름에서 등장하는 V의 개수
- E = 연두의 이름과 팀 이름에서 등장하는 E의 개수
그 다음, 위에서 구한 변수를 다음 식에 입력하면 팀 이름의 우승할 확률을 구할 수 있다.
((L+O) × (L+V) × (L+E) × (O+V) × (O+E) × (V+E)) mod 100
연두의 영어 이름과 팀 이름 후보 N개가 주어졌을 때, 우승할 확률이 가장 높은 팀 이름을 구해보자. 확률이 가장 높은 팀이 여러가지인 경우 사전 순으로 가장 앞서는 팀 이름이 우승할 확률이 가장 높은 것이다.
입력
첫째 줄에 연두의 영어 이름이 주어진다. 둘째 줄에는 팀 이름 후보의 개수 N이 주어진다. 셋째 줄부터 N개의 줄에 팀 이름이 한 줄에 하나씩 주어진다.
연두의 영어 이름과 팀 이름은 길이는 1보다 크거나 같고, 20보다 작거나 같으며, 알파벳 대문자로만 이루어져 있다. N은 50보다 작거나 같은 자연수이다.
출력
첫째 줄에 우승할 확률이 가장 높은 팀 이름을 출력한다.
예제 입력 | 예제 출력 |
LOVE 3 JACOB FRANK DANO |
FRANK |
JANE 4 THOMAS MICHAEL INDY LIU |
INDY |
LILLY 1 PIERRE |
PIERRE |
MERYLOV 5 JOHN DAVE STEVE JOHN DAVE |
DAVE |
LLOL 4 BVERON CVERON AVERON DVERON |
AVERON |
VELYLEOCEVE 5 YVXHOVE LCOKO OGWSJVEVEDLE WGFVSJEL VLOLUVCBLLQVESWHEEKC |
VLOLUVCBLLQVESWHEEKC |
풀이
#include <iostream>
using namespace std;
// 이름에 등장하는 알파벳의 개수
struct Love {
int L = 0;
int O = 0;
int V = 0;
int E = 0;
};
// 우승 확률 구하기
int probability(Love yeondu, string name) {
Love team;
team.L = yeondu.L;
team.O = yeondu.O;
team.V = yeondu.V;
team.E = yeondu.E;
// 연두의 이름과 팀명에 포함된 특정 알파벳들의 개수
for (int i = 0; i < name.length(); i++) {
if (name[i] == 'L') team.L++;
if (name[i] == 'O') team.O++;
if (name[i] == 'V') team.V++;
if (name[i] == 'E') team.E++;
}
// 우승 확률 계산
int num = ((team.L + team.O) * (team.L + team.V) * (team.L + team.E)
* (team.O + team.V) * (team.O + team.E) * (team.V + team.E)) % 100;
return num;
}
int main() {
string yName;
int N;
Love yeondu;
int big = -1; // 가장 높은 우승 확률
string bigTeam = "0"; // 우승 확률이 가장 높은 팀의 이름
// 입력
cin >> yName;
cin >> N;
// 연두의 이름에 등장하는 알파벳들
for (int j = 0; j < yName.length(); j++) {
if (yName[j] == 'L') yeondu.L++;
if (yName[j] == 'O') yeondu.O++;
if (yName[j] == 'V') yeondu.V++;
if (yName[j] == 'E') yeondu.E++;
}
// 각 팀의 우승 확률 구하기
for (int i = 0; i < N; i++) {
string tName;
cin >> tName;
int num = probability(yeondu, tName);
// 가장 높은 우승 확률인지 확인하기
if (big == -1 || num > big) {
big = num;
bigTeam = tName;
}
// 사전 순으로 가장 앞서는 팀 이름
else if (num == big && tName < bigTeam)
bigTeam = tName;
}
// 출력
cout << bigTeam << endl;
return 0;
}
Love라는 결과를 얻는데 영향을 주는 알파벳의 개수를 저장할 수 있는 구조체를 생성했다. 가장 먼저 연두의 영어 이름에 포함된 L, O, V, E의 개수를 세아린 뒤 팀 이름을 입력할 때마다 int probability(Love yeondu, string name);로 우승 확률을 계산했다. 그 뒤에 if문을 사용하여 가장 높은 우승 확률을 가진 팀 중에서 사전 순으로 가장 앞서는 팀을 찾아서 출력하도록 했다.
'백준 > C++' 카테고리의 다른 글
[Baekjoon/C++] 1333번 - 부재중 전화 (0) | 2022.05.21 |
---|---|
[Baekjoon/C++] 1297번 - TV 크기 (0) | 2022.05.21 |
[Baekjoon/C++] 1284번 집 주소 (0) | 2022.05.06 |
[Baekjoon/C++] 1268번 임시 반장 정하기 (0) | 2022.05.06 |
[Baekjoon/C++] 1267번 핸드폰 요금 (0) | 2022.05.06 |