본문 바로가기

백준/C++

[Baekjoon/C++] 1296번 - 팀 이름 정하기

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문을 사용하여 가장 높은 우승 확률을 가진 팀 중에서 사전 순으로 가장 앞서는 팀을 찾아서 출력하도록 했다.