-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path보석 쇼핑.cpp
45 lines (40 loc) · 1.4 KB
/
보석 쇼핑.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <string>
#include <vector>
#include <unordered_map>
#include <set>
using namespace std;
vector<int> solution(vector<string> gems) {
vector<int> answer;
unordered_map<string, int> gem_map; //key-보석, value-보석 포함 개수
set <string> gem_set(gems.begin(), gems.end()); //중복 원소 제외 저장
int unique_gem_count = gem_set.size();
int minDist, start = 0, end = gems.size() - 1;
for (int index = 0; index < gems.size(); index++) {
gem_map[gems[index]]++;
if (gem_map.size() >= unique_gem_count) { //모든 보석을 포함하는 지점을 찾음
end = index;
break;
}
}
answer = { start + 1, end + 1 };
minDist = end - start;
while (end < gems.size()) {
string gem = gems[start];
gem_map[gem]--;
start++; //start포인트를 증가시켜가며 가장 짧은 구간 검색
if (gem_map[gem] == 0) { //구간에 포함된 보석 개수가 0이라면
end++; //end포인트 증가
while (end < gems.size()) {
gem_map[gems[end]]++;
if (gems[end] == gem)
break;
end++; //해당 보석이 나올 때까지 end포인트 증가
}
}
if (end - start < minDist) {
answer = { start + 1, end + 1 };
minDist = end - start;
}
}
return answer;
}