[BOJ] 백준 #1296. 팀 이름 정하기 (C++)
C++ 백준 문제풀이 스터디에 들었다. 앞으로 매주 Bronze Ⅰ ~ Silver 난이도의 문제를 풀 것이다.
화이팅!!
🎨 문제
문제 링크: https://www.acmicpc.net/problem/1296
알고리즘 분류: 문자열 처리, 탐색
난이도: Bronze Ⅰ
💬 풀이
하. 일단 문제가 뭔소린지 이해하는 데 시간이 오래 걸렸음.. 근데 또 이해하고 나니까 딱히 어려운 것도 아니여서 어이가 없었다. 문제를 띄엄띄엄 대충 읽는 버릇을 고쳐야겠다.
- 우선 입력받을 애들을 다 입력받는다 ― 연두 이름, 팀이름 후보 개수, 팀이름 후보들
- 확률이 가장 높은 팀이 여러 개라면 사전순으로 우승 확률이 결정되므로 → 미리 팀이름 후보들을 sort(정렬)한다.
- 연두이름에서 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;
}
댓글남기기