Algorithm/BOJ
[백준 1296] 팀이름 정하기 c++
connieya
2021. 12. 5. 15:16
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개가 주어졌을 때, 우승할 확률이 가장 높은 팀 이름을 구해보자. 확률이 가장 높은 팀이 여러가지인 경우 사전 순으로 가장 앞서는 팀 이름이 우승할 확률이 가장 높은 것이다.
입력
첫째 줄에 연두의 영어 이름이 주어진다. 둘째 줄에는 팀 이름 후보의 개수 N이 주어진다. 셋째 줄부터 N개의 줄에 팀 이름이 한 줄에 하나씩 주어진다.
연두의 영어 이름과 팀 이름은 길이는 1보다 크거나 같고, 20보다 작거나 같으며, 알파벳 대문자로만 이루어져 있다. N은 50보다 작거나 같은 자연수이다.
출력
첫째 줄에 우승할 확률이 가장 높은 팀 이름을 출력한다.
풀이
- 연두 이름에 'L' , 'O' , 'V' , 'E', 문자열 개수를 담는 int 배열
- 팀 이름에 'L' , 'O' , 'V' , 'E', 문자열 개수를 담는 int 배열 생성
- 배열의 총 길이는 4로 인덱스 0 => 'L'의 개수, 인덱스 1 => 'O'의 개수, 인덱스 2 => 'V'의 개수, 인덱스 3 => 'E'의 개수
- 두 배열의 각 인덱스를 더한 뒤 이환이가 만든 공식으로 확률 값 구하기
#include "stdio.h"
#include "string.h"
// 문자열에 있는 'L' ,'O', 'V' ,'E' 개수 카운트
void countLoveCharacter(char name[], int love[4]) {
for (int i = 0; name[i] != 0; i++) {
if (name[i] == 'L') {
love[0]++;
continue;
}
if (name[i] == 'O') {
love[1]++;
continue;
}
if (name[i] == 'V') {
love[2]++;
continue;
}
if (name[i] == 'E') {
love[3]++;
continue;
}
}
}
int main(void) {
char name[21], team[21], answer[21];
int n;
int love[4] = {0}; // 연두 이름에 있는 'L','O','V' ,'E' 개수
scanf("%s", name);
scanf("%d", &n);
countLoveCharacter(name, love); // 'L','O','V','E' 카운트 세기
int max = -1;
while (n--) {
scanf("%s", team);
int love2[4] = {0}; // 팀 이름에 있는 'L','O','V' ,'E' 개수
countLoveCharacter(team, love2); // 'L','O','V','E' 카운트 세기
love2[0] += love[0]; // 연두와 팀이름에 있는 'L'의 총 개수
love2[1] += love[1]; // 연두와 팀이름에 있는 'O'의 총 개수
love2[2] += love[2]; // 연두와 팀이름에 있는 'V'의 총 개수
love2[3] += love[3]; // 연두와 팀이름에 있는 'E'의 총 개수
int percentage = 1; // 이환이가 만든 공식
for (int i = 0; i < 3; i++) {
for (int j = i + 1; j < 4; j++) {
percentage *= (love2[i] + love2[j]);
}
}
percentage %= 100;
if (percentage > max) { // 확률이 제일 높으면 max 값 갱신
max = percentage;
strcpy(answer, team); // answer에 해당 팀 이름 저장
} else if (percentage == max) { // 확률 값이 같으면 사전 순으로 비교
if (strcmp(answer, team) > 0) {
strcpy(answer, team); // 사전 순으로 앞에 오는 팀이름 저장
}
}
}
printf("%s", answer);
}