#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
vector<pair<int, string>> book(n, {1, " "});
cin >> book[0].second;
for (int i = 1; i < n; i++)
{
cin >> book[i].second;
for (int j = 0; j <= i - 1; j++)
{
if (book[i].second == book[j].second)
{
book[j].first++;
}
}
}
sort(book.rbegin(), book.rend());
vector<string> name;
int max = book[0].first;
name.push_back(book[0].second);
for (int i = 1; i < n; i++)
{
if (max == book[i].first)
{
name.push_back(book[i].second);
}
else
break;
}
sort(name.begin(), name.end());
cout << name[0];
return 0;
}
<aside> 💡
{등장횟수, 책 이름}을 pair로 만들고 책 이름을 입력받는다. 새로 입력받는 책의 이름과 그 전에 입력받았던 책들의 이름이 같은 경우 이전에 입력받은 책의 등장횟수를 ++해준다. 등장횟수를 기준으로 내림차순으로 book 벡터를 정렬해준뒤 등장횟수가 같은 경우 사전순 정렬을 해야하므로 새로운 name 벡터를 만들어 최고 등장횟수의 책들을 name벡터에 넣어준다. name을 오름차순 정렬해주고 사전순으로 가장 빠른 책 이름을 출력한다.
</aside>
#include <bits/stdc++.h>
using namespace std;
int k;
vi lotto;
vi com(6);
void dfs(int first, int len)
{
if (len == 6)
{
for (int i = 0; i < 6; i++)
{
cout << com[i] << " ";
}
cout << "\\n";
return;
}
for (int i = first; i < k; i++)
{
com[len] = lotto[i];
dfs(i + 1, len + 1);
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
while (1)
{
cin >> k;
lotto.resize(k);
if (k == 0)
return 0;
for (int i = 0; i < k; i++)
{
cin >> lotto[i];
}
dfs(0, 0);
cout << "\\n";
}
return 0;
}
<aside> 💡
dfs(first, len)
함수는 6개의 로또 번호 조합을 재귀적으로 만든다. first
는 현재 조합에서 선택할 번호의 시작 인덱스를, len
은 지금까지 고른 번호 개수를 나타낸다. len == 6
이면 6개 번호가 다 고른 거니까 그때 조합을 출력하고 끝낸다. 아니면 first
부터 번호를 하나씩 고르고, 고른 번호를 com
에 넣고, dfs(i + 1, len + 1)
로 다음 번호를 재귀적으로 고르게 된다. 이 방식으로 모든 가능한 6개 번호 조합을 만든다.
</aside>