https://www.acmicpc.net/problem/1296
코드 (C)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void* a, const void* b);
int calc(char s[], int l, int o, int v, int e);
int main()
{
int n, name_cnt[4] ={0,}, max=-1;
char arr_name[51][21], name[21];
scanf("%s", &name);
scanf("%d", &n);
int* percent = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) scanf("%s", &arr_name[i]);
for (int i = 0; name[i] != '\0'; i++)
{
if (name[i] == 'L') name_cnt[0]++;
else if (name[i] == 'O') name_cnt[1]++;
else if (name[i] == 'V') name_cnt[2]++;
else if (name[i] == 'E') name_cnt[3]++;
}
qsort(arr_name, n, sizeof(arr_name[0]), compare);
for (int i = 0; i < n; i++)
percent[i] = calc(arr_name[i], name_cnt[0], name_cnt[1], name_cnt[2], name_cnt[3]);
for (int i = 0; i < n; i++) if (max < percent[i]) max = percent[i];
for (int i = 0; i < n; i++)
{
if (max == percent[i])
{
printf("%s", arr_name[i]);
break;
}
}
free(percent);
return 0;
}
int compare(const void* a, const void *b)
{
return strcmp(a, b);
}
int calc(char s[], int l, int o, int v, int e)
{
for (int i = 0; s[i] != '\0'; i++)
{
if (s[i] == 'L') l++;
else if (s[i] == 'O') o++;
else if (s[i] == 'V') v++;
else if (s[i] == 'E') e++;
}
return ((l + o) * (l + v) * (l + e) * (o + v) * (o + e) * (v + e)) % 100;
}
코드 (C++)
#include <iostream>
#include <cstdlib>
#include <algorithm>
using namespace std;
int calc(string s, int l, int o, int v, int e);
int main()
{
char name[21];
int n, cnt[4] = {0,}, max = -1;
cin >> name;
cin >> n;
int* percent = new int[n];
string* arr_name = new string[n];
for (int i = 0; name[i] != '\0'; i++)
{
if (name[i] == 'L') cnt[0]++;
else if (name[i] == 'O') cnt[1]++;
else if (name[i] == 'V') cnt[2]++;
else if (name[i] == 'E') cnt[3]++;
}
for (int i = 0; i < n; i++) cin >> arr_name[i];
sort(arr_name, arr_name+n);
for (int i = 0; i < n; i++) percent[i] = calc(arr_name[i], cnt[0], cnt[1], cnt[2], cnt[3]);
for (int i = 0; i < n; i++) if (max < percent[i]) max = percent[i];
for (int i = 0; i < n; i++)
{
if (max == percent[i])
{
cout << arr_name[i];
break;
}
}
delete[]percent;
delete[]arr_name;
return 0;
}
int calc(string s, int l, int o, int v, int e)
{
for (int i = 0; s[i] != '\0'; i++)
{
if (s[i] == 'L') l++;
else if (s[i] == 'O') o++;
else if (s[i] == 'V') v++;
else if (s[i] == 'E') e++;
}
return ((l + o) * (l + v) * (l + e) * (o + v) * (o + e) * (v + e)) % 100;
}
코드 설명
메인 함수
연두의 이름과 이름후보의 개수를 입력받는다. 이후 배열에 이름후보를 입력받아 저장한다.
연두의 이름에서 L, O, V, E의 등장횟수를 구해야 하는데, 메인함수에서는 cnt라는 배열에 L, O, V, E 순으로 저장한다. (반복문을 사용해서 구했다.)
이후 c에서는 qsort, c++에서는 algorithm 헤더파일에 있는 sort함수를 사용해서 이름후보들을 사전 순으로 정렬한다.
반복문을 돌면서 각각의 이름후보의 우승확률을 percent배열에 저장한다.
반복문을 돌면서 최대 확률을 구한 다음에, 반복문에서 percent[i]==max인 경우의 이름후보를 출력하고 반복문을 탈출한다. 선언한 동적배열을 해제하고 프로그램을 종료한다.
calc 함수
확률을 구하는 함수이다. 문자열과 연두의 이름에서 등장한 L,O,V,E의 개수를 인수로 받는다. 연두의 이름에서 L,O,V,E의 개수를 구한 것과 같은 방식으로 l,o,v,e의 값을 최종적으로 구한다. (함수를 호출할 때의 l,o,v,e는 연두의 이름에서의 L,O,V,E의 개수이고 반복문에서 경우에 해당하면 그 값을 증가시킨다.) 문제에서 제시된 공식의 결과를 반환한다.
느낀 점
문제만 잘 파악하면 금방 풀 수 있는 문제였다! 코드 자체가 길긴 한데, L,O,V,E의 개수를 구하는 반복문을 함수로 구현하는 것 말고는 현재로서는 코드를 간결화할 수 있는 방법이 떠오르지 않는다.
'PS (C, C++)' 카테고리의 다른 글
[백준/C & C++] 8595 히든 넘버 (0) | 2022.11.26 |
---|---|
[백준/C & C++] 1541 잃어버린 괄호 (0) | 2022.11.26 |
[백준/C & C++] 1302 베스트셀러 (0) | 2022.11.05 |
[백준/C & C++] 1181 단어 정렬 (0) | 2022.10.30 |
[백준/C & C++] 11050 이항 계수 1 (2) | 2022.10.05 |