[BOJ] 백준 #1296. 팀 이름 정하기 (C++)

1 분 소요

C++ 백준 문제풀이 스터디에 들었다. 앞으로 매주 Bronze Ⅰ ~ Silver 난이도의 문제를 풀 것이다.


화이팅!!


🎨 문제

boj-1296 문제 링크: https://www.acmicpc.net/problem/1296 알고리즘 분류: 문자열 처리, 탐색 난이도: Bronze Ⅰ


💬 풀이

하. 일단 문제가 뭔소린지 이해하는 데 시간이 오래 걸렸음.. 근데 또 이해하고 나니까 딱히 어려운 것도 아니여서 어이가 없었다. 문제를 띄엄띄엄 대충 읽는 버릇을 고쳐야겠다.

  1. 우선 입력받을 애들을 다 입력받는다 ― 연두 이름, 팀이름 후보 개수, 팀이름 후보들
  2. 확률이 가장 높은 팀이 여러 개라면 사전순으로 우승 확률이 결정되므로 → 미리 팀이름 후보들을 sort(정렬)한다.
  3. 연두이름에서 L,O,V,E의 갯수 + 각 팀이름의 L,O,V,E의 갯수를 합해 계산값이 가장 크면서 사전순으로 가장 앞서는 놈이 정답.



👩‍💻 코드

C++

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
	//freopen("input.txt", "rt", stdin);
	string yeondu;
	int N;
	cin >> yeondu >> N;
	string* teamname = new string[N];
	for (int i = 0; i < N; i++) {
		cin >> teamname[i];
	}	
	// 팀이름 후보들을 사전순(오름차순)으로 정렬
	sort(teamname, teamname + N);

	int yeondu_l = 0, yeondu_o = 0, yeondu_v = 0, yeondu_e = 0;
	int l_cnt = 0, o_cnt = 0, v_cnt = 0, e_cnt = 0;
	int L = 0, O = 0, V = 0, E = 0;
	int* winning_probability = new int[N];

	// 연두 이름에서 'l','o','v','e' 개수 카운트
	for (int i = 0; i < yeondu.size(); i++) {
		if (yeondu[i] == 'L') { yeondu_l++; }
		if (yeondu[i] == 'O') { yeondu_o++; }
		if (yeondu[i] == 'V') { yeondu_v++; }
		if (yeondu[i] == 'E') { yeondu_e++; }
	}
	
	// 팀이름 후보에서 'l','o','v','e' 개수 카운트
	int max = -1, idx;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < teamname[i].size(); j++) {
			if (teamname[i][j] == 'L') { l_cnt++; }
			if (teamname[i][j] == 'O') { o_cnt++; }
			if (teamname[i][j] == 'V') { v_cnt++; }
			if (teamname[i][j] == 'E') { e_cnt++; }
		}

		// 확률이 가장 높은 팀이름 저장
		L = yeondu_l + l_cnt; l_cnt = 0;
		O = yeondu_o + o_cnt; o_cnt = 0;
		V = yeondu_v + v_cnt; v_cnt = 0;
		E = yeondu_e + e_cnt; e_cnt = 0;
		winning_probability[i] = ((L + O) * (L + V) * (L + E) * (O + V) * (O + E) * (V + E)) % 100;
		if (max < winning_probability[i]) {
			max = winning_probability[i];
			idx = i;
		}
	}

	cout << teamname[idx];

	return 0;
}


댓글남기기