https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 ※ 문제

경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 '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

+ Recent posts