다음과 같은 것들을 정의합니다.
1차원 정수 배열 a가 매개변수로 주어집니다. a의 모든 부분 수열 중에서 가장 길이가 긴 스타 수열의 길이를 return 하도록 solution 함수를 완성해주세요. 이때, a의 모든 부분 수열 중에서 스타 수열이 없다면, 0을 return 해주세요.
| a | result |
|---|---|
| [0] | 0 |
| [5,2,3,3,5,3] | 4 |
| [0,3,3,0,7,2,0,2,2,0] | 8 |
-> 해당 문제 풀이는 정렬할 때 O(NlogN)의 시간복잡도를 가지고, 가장 긴 스타 수열의 길이를 찾을 때 O(N*M)의 시간복잡도를 가질 것으로 보이고, N은 a의 수의 최대 값인 500,000, M은 a의 길이인 500,000으로 언뜻 보았을 때는 시간초과가 날 수도 있으나, 가지치기 때문에 시간초과는 안 날 것으로 보인다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct numCount{
int num;
int count = 0;
};
int solution(std::vector<int> a) {
// 숫자 별로 가장 많이 나온 순서대로 정렬하기
unordered_map<int, int> frequency;
for(int num : a){
frequency[num]++;
}
vector<numCount> numCounts;
for(auto it = frequency.begin(); it != frequency.end(); ++it){
numCounts.push_back({it->first, it->second});
}
sort(numCounts.begin(), numCounts.end(), [](numCount a, numCount b){
return a.count > b.count;
});
// 가장 많이 나온 숫자부터 그 숫자를 교집합으로 하는 가장 긴 스타 수열의 길이 찾기
int answer = 0;
for(int i = 0; i < numCounts.size(); ++i){
int num = numCounts[i].num;
int count = numCounts[i].count;
if(answer >= count * 2) break;
int maxCount = 0;
for(int idx = 0; idx < a.size() - 1; ++idx){
if((a[idx] == num || a[idx + 1] == num) && (a[idx] != a[idx + 1])){
maxCount += 2;
idx++;
}
}
answer = max(answer, maxCount);
}
return answer;
}