Unicorns

All the things

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 1296] 팀이름 정하기 c++
    Algorithm/BOJ 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);
    }

    댓글

Designed by Tistory.