(C++) 백준 1296번 - 팀 이름 정하기

코딩너구리·2025년 9월 28일

코딩 문제 풀이

목록 보기
4/266

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와 비교하는 부분과 최고점 판별부가 난잡하게 느껴져서 압축할 수 있는 방법을 알아보자

0개의 댓글