-
[2018 상반기 카카오 블라인드 채용 1차] 프로그래머스 카카오 캐시(난이도 하)Algorithm/대회 및 기타 2018. 9. 13. 19:46
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17680
※ 추천 선행 알고리즘 : list, queue, stack 등 기본적인 자료구조
문제 설명
캐시
지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다.
이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다.
어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다.어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오.
입력 형식
- 캐시 크기(
cacheSize
)와 도시이름 배열(cities
)을 입력받는다. cacheSize
는 정수이며, 범위는 0 ≦cacheSize
≦ 30 이다.cities
는 도시 이름으로 이뤄진 문자열 배열로, 최대 도시 수는 100,000개이다.- 각 도시 이름은 공백, 숫자, 특수문자 등이 없는 영문자로 구성되며, 대소문자 구분을 하지 않는다. 도시 이름은 최대 20자로 이루어져 있다.
출력 형식
- 입력된 도시이름 배열을 순서대로 처리할 때,
총 실행시간
을 출력한다.
조건
- 캐시 교체 알고리즘은
LRU
(Least Recently Used)를 사용한다. cache hit
일 경우 실행시간은1
이다.cache miss
일 경우 실행시간은5
이다.
입출력 예제
캐시크기(cacheSize) 도시이름(cities) 실행시간 3 [ Jeju
,Pangyo
,Seoul
,NewYork
,LA
,Jeju
,Pangyo
,Seoul
,NewYork
,LA
]50 3 [ Jeju
,Pangyo
,Seoul
,Jeju
,Pangyo
,Seoul
,Jeju
,Pangyo
,Seoul
]21 2 [ Jeju
,Pangyo
,Seoul
,NewYork
,LA
,SanFrancisco
,Seoul
,Rome
,Paris
,Jeju
,NewYork
,Rome
]60 5 [ Jeju
,Pangyo
,Seoul
,NewYork
,LA
,SanFrancisco
,Seoul
,Rome
,Paris
,Jeju
,NewYork
,Rome
]52 2 [ Jeju
,Pangyo
,NewYork
,newyork
]16 0 [ Jeju
,Pangyo
,Seoul
,NewYork
,LA
]25 Algorithm
chcheSize만큼을 가진 캐시 안에서 LRU 알고리즘을 활용하여 도시 이름들을 모두 처리한다.* 여기서 LRU 알고리즘이란, 운영체제에서 쓰이는 알고리즘으로써 queue형태와 같지만 캐시 안에 있는 동일한 값을 활용할 때는 해당 값을 제거 후, 다시 뒤로 보내버리는 것을 의미하는데 그림으로 보면 다음과 같다.1. 5번째 테스트 케이스를 먼저 보면 NewYork과 newyork은 문자열을 다르지만 같은 도시로 취급한다. 먼저 cities 안의 있는 모든 string값을 소문자 혹은 대문자로 바꾸어준다.
transform이라는 함수를 활용하면 편한데
transform(some.begin(), some.end(), some.begin(), ::tolower);
이 때 transform의 3번째 인자 some.begin()은 ::tolower한 값을 저장할 장소를 의미한다. (::toupper는 대문자)
2. 바꾸어줬다면 하나의 list를 만들면된다.
* 이 때, Queue를 왜 사용하지 않았나 라는 의문점이 든다면, queue는 동일한 값을 찾았을 때 해당 인덱스를 찾아 제거하는 것이 불가능하기 때문에 나는 list를 활용하였다.
list에 하나씩 담기 전, list에 해당 값이 있는지 없는지부터 검사해야하는데 cahceSize의 max를 30으로 지정을 해주었기 때문에 시간복잡도 면에서 크게 좌우되지 않을 것 같으니 알고리즘을 활용하지 않고 자유롭게 찾으면 될 것 같다.(난 find()를 활용)
3. 나머지는 기본적인 list 알고리즘이므로 설명을 생략하겠음.
//kuklife.tistory.com
#include <string>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
int solution(int cacheSize, vector<string> cities) {
int answer = 0;
list<string> cache;
if (cacheSize == 0)
return cities.size() * 5;
for (int i = 0; i < cities.size(); i++) {
transform(cities[i].begin(), cities[i].end(), cities[i].begin(), ::tolower);
auto temp = find(cache.begin(), cache.end(), cities[i]);
if (temp != cache.end()) {
cache.remove(cities[i]);
cache.push_back(cities[i]);
answer+=1;
}
else {
answer += 5;
if (cache.size() >= cacheSize)
cache.pop_front();
cache.push_back(cities[i]);
}
}
return answer;
}
'Algorithm > 대회 및 기타' 카테고리의 다른 글
[2018 상반기 카카오 블라인드 채용 1차] 프로그래머스 카카오 뉴스 클러스터링(난이도 중) (0) 2018.09.20 [2018 상반기 카카오 블라인드 채용 1차] 프로그래머스 카카오 프렌즈4블록(난이도 상) (0) 2018.09.19 [2018 상반기 카카오 블라인드 채용 1차] 프로그래머스 카카오 셔틀버스(난이도 중) (0) 2018.09.18 [2018 상반기 카카오 블라인드 채용 1차] 프로그래머스 카카오 비밀지도(난이도 하) (0) 2018.09.13 [카카오코드 2017] 프로그래머스 카카오프렌즈 컬러링북 (0) 2018.09.12 - 캐시 크기(