https://school.programmers.co.kr/learn/courses/30/lessons/67258
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

문제를 읽자마자 투포인터로 풀어야한다는 느낌이 듭니다.
다만 이런 문제는 구현할 때 실수가 생기기 쉽죠
물론 제가 실수해서 하는 말입니다.
아이디어는 간단합니다. 투포인터로 left, right 인덱스를 관리하며 모두 포함한다면 left를, 포함하고 있지 않다면 right를 움직이는 방식으로 계산해나가면 됩니다.
#include <string>
#include <vector>
#include <unordered_map>
#include <unordered_set>
using namespace std;
vector<int> solution(vector<string> gems)
{
unordered_map<string, int> gemMap;
for (auto gem : gems)
{
if (gemMap.find(gem) == gemMap.end())
{
gemMap.insert({ gem, 0 });
}
else
{
++gemMap[gem];
}
}
int l = 0, r = 0;
int N = gems.size();
int kind = gemMap.size();
vector<int> answer;
answer = { 1, N };
int ansLen = N;
unordered_map<string, int> gemCnt;
for (auto [gem, cnt] : gemMap)
{
gemCnt.insert({ gem, 0 });
}
unordered_set<string> gemSet;
while (l < N && r < N)
{
int size = gemSet.size();
if (size == kind)
{
--gemCnt[gems[l]];
if (gemCnt[gems[l]] == 0)
{
gemSet.erase(gems[l]);
}
if (ansLen > r - l)
{
answer = { l+1, r};
ansLen = r - l;
}
++l;
}
else
{
++gemCnt[gems[r]];
if (gemCnt[gems[r]] == 1)
{
gemSet.insert(gems[r]);
}
++r;
}
}
while (l < N && gemSet.size() == kind)
{
if (ansLen > r - l)
{
answer = { l + 1, r };
ansLen = r - l;
}
--gemCnt[gems[l]];
if (gemCnt[gems[l]] == 0)
{
gemSet.erase(gems[l]);
}
++l;
}
return answer;
}
코드에 부족한 점이 많네요
'Algorithm > PS' 카테고리의 다른 글
| [1일 1알고] 연속 펄스 부분 수열의 합 (0) | 2026.05.18 |
|---|---|
| [1일 1알고] 블록 이동하기 (0) | 2026.05.16 |
| [1일 1알고] 단어 퍼즐 (0) | 2026.05.14 |
| [1일 1알고] 경주로 건설 (0) | 2026.05.13 |
| [1일 1알고] 부대 복귀 (0) | 2026.05.12 |