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);
}