https://www.acmicpc.net/problem/1296
문제
> 우승할 확률이 높아지는 팀 이름을 정해야한다.
> 연두의 이름이 주어졌을때 연두의 이름과 팀 이름 후보들에서
L, O, V, E가 등장하는 개수를 구한다.
> ((L+O) × (L+V) × (L+E) × (O+V) × (O+E) × (V+E)) mod 100를 계산한다.
> 가장 큰 확률의 팀 이름을 선택한다.
접근
들어온 이름과 팀이름을 반복을 돌며 LOVE와 비교하며 해당 문자가 존재하면 개수를 누적한뒤 해당 수열을 구현해 계산해 결과를 도출한다.
문제 해결
팀 이름수 만큼 반복하며 연두 이름과 팀 이름을 합친 후
만들어진 문자열을 순회하며 LOVE와 겹칠때마다 각각의 수를 누적시킨다.
누적된 수로 수식에 넣어 계산한 뒤 반복문이 진행될때마다 나오는 값과 서로 비교해 큰 수를 뽑고 해당 문자열을 출력한다.
코드
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int N;
string name;
string best;
cin >> name;
cin >> N;
int maxscore = -1;
vector<string> tname(N);
for (int i = 0; i < N; i++)
cin >> tname[i];
for (string team : tname)
{
string combname = name + team;
int L = 0, O = 0, V = 0, E = 0;
for (char c : combname)
{
if (c == 'L') L++;
else if (c == 'O') O++;
else if (c == 'V') V++;
else if (c == 'E') E++;
}
int score = ((L + O) * (L + V) * (L + E) * (O + V) * (O + E) * (V + E)) % 100;
if (score > maxscore)
{
maxscore = score;
best = team;
}
else if (score == maxscore)
{
best = (best < team) ? best : team;
}
}
cout << best;
}

후기
c++ 스타일의 반복문을 적용해보았는데 잘 되었고 편했다.
LOVE와 비교하는 부분과 최고점 판별부가 난잡하게 느껴져서 압축할 수 있는 방법을 알아보자