https://school.programmers.co.kr/learn/courses/30/lessons/138476
※ 문제
경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.
예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.
경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.
※ 나의 풀이
푸는 방법은 두가지가 있을것 같다.
첫번째는 귤 크기마다 몇개씩 있는지 정렬 또는 DFS를 이용해서 풀면 될 것 같다.
- 정렬
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
bool cmp(pair<int, int> a, pair<int, int> b)
{
return a.second > b.second;
}
int solution(int k, vector<int> tangerine) {
// map으로 종류 횟수 저장
map<int, int> tmp;
for (int i = 0; i < tangerine.size(); i++)
{
tmp[tangerine[i]]++;
}
// 횟수 기준으로 정렬
vector<pair<int, int>> vtmp;
for (pair<int, int> t : tmp)
{
vtmp.push_back(make_pair(t.first, t.second));
}
sort(vtmp.begin(), vtmp.end(), cmp);
// 정답 구해주기
int sa = k;
int answer = 0;
for (int i = 0; i < sa; i++)
{
if (k <= 0) break;
else
{
k -= vtmp[i].second;
answer++;
}
}
return answer;
}
- DFS → 시간초과 발생
#include <string>
#include <vector>
using namespace std;
int answer;
vector<int> tangerine;
void DFS(int idx, int cnt, vector<int> res, vector<int> ch_idx_tan, vector<int> ch_tan)
{
if (idx == res.size())
{
if (answer > cnt)
{
answer = cnt;
}
}
else
{
for (int i = 0; i < tangerine.size(); i++)
{
if (ch_idx_tan[i] == 0) // 사용한 tangerine의 idx 체크
{
ch_idx_tan[i] = 1;
res[idx] = tangerine[i];
if (ch_tan[tangerine[i]] == 0) // 새로운 숫자면 cnt++
{
ch_tan[tangerine[i]]++;
DFS(idx + 1, cnt + 1, res, ch_idx_tan, ch_tan);
ch_tan[tangerine[i]]--;
}
else // ch_tan[tangerine[i]] != 0
{
ch_tan[tangerine[i]]++;
DFS(idx + 1, cnt, res, ch_idx_tan, ch_tan);
ch_tan[tangerine[i]]--;
}
ch_idx_tan[i] = 0;
}
}
}
}
int solution(int k, vector<int> tangerin) {
answer = 2147000000;
tangerine = tangerin;
vector<int> res(k, 0);
vector<int> ch_tan(tangerine.size(), 0); // 숫자별 사용 횟수
vector<int> ch_idx_tan(tangerine.size(), 0); // tan에서 사용한 인덱스 체크
DFS(0, 0, res, ch_idx_tan, ch_tan);
return answer;
}
'알고리즘 > Coding Test' 카테고리의 다른 글
우박수열 정적분 C++ (0) | 2023.04.21 |
---|---|
숫자 카드 나누기 C++ (0) | 2023.04.20 |
당구 연습 C++ (0) | 2023.04.18 |
리코쳇 로봇 C++ (1) | 2023.04.17 |
광물 캐기 C++ (0) | 2023.04.17 |