오늘의 알고리즘
[C++]2020 카카오 인턴십 보석 쇼핑(프로그래머스 3레벨)
하늘하늘 .
2022. 3. 17. 16:14
#include <string>
#include <vector>
#include <unordered_map>
#include <set>
#include <iostream>
// 투포인트 알고리즘
using namespace std;
vector<int> solution(vector<string> gems)
{
vector<int> answer(2);
unordered_map<string, int> unMap = {};
set<string> num(gems.begin(), gems.end());
int iMin, iStart = 0, iEnd = 0;
for (auto& gem : gems)
{
unMap[gem]++;
// 처음 최대 거리 입력
if (unMap.size() == num.size())
break;
++iEnd;
}
//구간 차이 구하기
iMin = iEnd - iStart;
answer[0] = iStart;
answer[1] = iEnd;
while (iEnd < gems.size())
{
// 앞 포인터 앞으로
string sKey = gems[iStart];
--unMap[sKey];
++iStart;
// 갑자기 하나가 삭제되었을 경우
if (unMap[sKey] == 0)
{
// 뒤에 있는 것 찾기
++iEnd;
for (; iEnd < gems.size(); ++iEnd)
{
++unMap[gems[iEnd]];
if (sKey == gems[iEnd])
break;
}
// 마지막이라면 아예 종료
if (iEnd == gems.size())
break;
}
// 이전 길이보다 짧다면
if (iMin > iEnd - iStart)
{
answer[0] = iStart;
answer[1] = iEnd;
iMin = iEnd - iStart;
}
}
++answer[0];
++answer[1];
return answer;
}
이건 왜 몰랐을까... 너무 아쉽다...
포인트를 사용해서 할 수 있다
알고리즘에 대해 지식이 좀 부족한거 같은데... 흠...