https://school.programmers.co.kr/learn/courses/30/lessons/17680
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#include <string>
#include <vector>
#include <deque>
#include<iostream>
#include <unordered_map>
using namespace std;
int solution(int cacheSize, vector<string> cities) {
unordered_map<string, string>um;
int answer = 0;
deque<string> cache;
char ch;
for (int y = 0; y < cities.size(); ++y) {
for (int x = 0; x < cities[y].size(); ++x) {
if (cities[y][x] >= 'A' && cities[y][x] <= 'Z') {
cities[y][x] = 'a' + cities[y][x] - 'A';
}
} // 대소문자 구분 없는 조건
if (y < cacheSize) { //deque를 통해 cacheSize만큼 원소를 넣는다.
if (um[cities[y]] == cities[y]) { // 다만, 히트인 경우 해당 원소를 직접 찾아가서 지우고 갱신
answer += 1;
int idx = 0;
for(auto st : cache){
if (st == cities[y]) {
cache.erase(cache.begin() + idx);
break;
}
idx++;
}
cache.push_back(cities[y]);
continue;
}
cache.push_back(cities[y]);
um[cities[y]] = cities[y];
answer += 5;
}
}
if (cacheSize == 0) { // 캐시사이즈가 0이면 바로 답 추출.
return answer + cities.size() * 5;
}
for (int y = cacheSize; y < cities.size(); ++y)
{
//hash map
if (um[cities[y]] == cities[y]) { // hit
answer += 1;
int idx = 0;
for (auto st : cache) {
if (st == cities[y]) {
cache.erase(cache.begin() + idx);
break;
}
idx++;
}
cache.push_back(cities[y]);
}
else { //miss
if (cache.size() < cacheSize) { // 캐시사이즈
um[cities[y]] = cities[y];
cache.push_back(cities[y]);
answer += 5;
continue;
}
string tmp = cache.front();
cache.erase(cache.begin());
um[tmp] = "";
um[cities[y]] = cities[y];
cache.push_back(cities[y]);
answer += 5;
}
//hash에 없을 경우 queue pop 및 push +5
}
return answer;
}
int main() {
cout<<solution(2,{ "a","a","a","b","b","b","c", "C","c"});
}
풀이 설명 ( 못풀었다면 못푼이유 )
해시맵은 해당 원소가 히트인지 여부를 파악하고 히트이면 answer +=1 미스이면 answer+=5 와 더불어 해시 키값을 설정한다.
디큐의 경우는 히트이면 기존 원소의 인덱스를 마지막 인덱스로 갱신하는 용도이다. 디큐의 경우 특정인덱스에 접근 하여 원소를 삭제함과 동시에 push_back을 통해 원소값을 추가하는 특징이 있기에 디큐를 사용했다.
중요한 부분은 캐시사이즈를 고려하는 것이다. 미스 인 경우 그리고 캐시사이즈가 남이있다면 기존 원소들은 그대로 놓고 새로운 값을 추가만하면된다.
- 답지를 직접적으로 참조하기보단, 힌트와 TC를 보면서 풀이했다. 그럼에도 시간 초과.
'PS > 프로그래머스' 카테고리의 다른 글
오픈채팅방 (lv2) (0) | 2024.10.30 |
---|---|
택배 배달과 수거하기 (lv2, 답지 참조) (1) | 2024.10.23 |
땅따먹기 lv2 (0) | 2024.08.01 |
할인행사 lv2 (0) | 2024.06.27 |
모음 사전 (0) | 2023.08.26 |