Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 3273
- 그리디알고리즘
- 회의실 배정
- 탄막 이동
- 걷는건귀찮아
- 토글 그룹
- 원형
- MySQL
- 백준
- SWEA
- 유니티
- 문자열 압축
- 수 만들기
- 우분투
- 18249
- 단어 수학
- 자료구조 목차
- 3344
- 알고리즘
- 영상 프레임 추출
- 강의실2
- mysqld.sock
- 2020 KAKAO BLIND RECRUITMENT
- 탄막 스킬 범위
- 마우스 따라다니기
- 윈도우
- AI Hub
- c#
- 탄막
- 알고리즘 목차
Archives
- Today
- Total
와이유스토리
[슬라이딩 윈도우] 프로그래머스 보석 쇼핑 C++ 본문
https://school.programmers.co.kr/learn/courses/30/lessons/67258
슬라이딩 윈도우
#include <string>
#include <vector>
#include <set>
#include <unordered_map>
using namespace std;
vector<int> solution(vector<string> gems) {
vector<int> answer = {100000, 100000};
unordered_map<string, int> mp;
set<string> s;
for(auto g : gems) s.insert(g);
int n = gems.size();
int type = s.size();
int end = 0;
int dist = n + 1;
for(int start=0; start<n; start++) { // 슬라이딩 윈도우 방식
while (mp.size() < type) {
if (end >= n) break;
if (mp.find(gems[end]) != mp.end()) mp[gems[end]]++;
else mp.insert({gems[end], 1});
end++;
}
if (mp.size() == type) { // while문 바깥
if ((dist > end - start) || ((dist == end - start) && (answer[0] > start + 1))) {
dist = end - start;
answer = {start + 1, end};
}
}
mp[gems[start]]--;
if (!mp[gems[start]]) mp.erase(mp.find(gems[start]));
}
return answer;
}
구간합
효율성 실패
#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> mp;
for(auto g : gems) mp.insert({g, mp.size()});
int type = mp.size();
int n = gems.size();
int arr[n+1][type];
fill(&arr[0][0], &arr[n][type], 0);
for(int i=0; i<n; i++) {
int idx = mp[gems[i]];
arr[i+1][idx]++; // 시작점 포함, 끝점 미포함
for(int j=0; j<type; j++) arr[i+1][j] += arr[i][j];
}
int start = 0;
int end = 1;
int dist = n + 1;
while(start < end) { // 누적합 인덱스 ex) 3-1 = [1,2]
if ((start > n) || (end > n)) break;
int cnt = 0;
for(int j=0; j<type; j++) {
if (arr[end][j] - arr[start][j] > 0) cnt++;
}
if (cnt == type) {
if (dist > (end - start)) {
dist = end - start;
answer = {start + 1, end};
}
start++;
}
else if (cnt < type) end++;
else start++;
}
return answer;
}
'코딩테스트 > 분할정복|이진탐색|투포인터' 카테고리의 다른 글
[이진 탐색] 프로그래머스 입국심사 Java (0) | 2022.01.27 |
---|---|
[이진 탐색] 백준 1654 랜선 자르기 C++ (0) | 2022.01.25 |
[병합 정렬] 백준 1517 버블 소트 C++ (0) | 2022.01.24 |
[투포인터] 백준 3273 두 수의 합 Java (2) | 2020.12.27 |
Comments