#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;
}
 

이건 왜 몰랐을까... 너무 아쉽다...

포인트를 사용해서 할 수 있다

알고리즘에 대해 지식이 좀 부족한거 같은데... 흠...

+ Recent posts