본문 바로가기
프로그래머스

[프로그래머스] 2018 KAKAO BLIND RECRUITMENT - [1차] 캐시, C++

by 황인태(intaehwang) 2020. 1. 4.
반응형

https://programmers.co.kr/learn/courses/30/lessons/17680

 

코딩테스트 연습 - [1차] 캐시 | 프로그래머스

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, S

programmers.co.kr

 본 문제는 '2018 KAKAO BLIND RECRUITMENT'로 kakao Tech에 의하면 "정답률 45.26%," 라고 한다. 난이도는 하로 구분되어 있다. 1차 코딩 테스트이기 때문에 난이도에 상관없이 정답률이 낮은 편이다. LRU 캐시 교체 알고리즘을 구현하는 문제로 LRU란 Least Recently Used의 약자로 페이지 교체 알고리즘에 해당한다.

 페이지 교체 알고리즘이란 OS에서 페이지 부재 시, 새로운 페이지를 할당하기 위해 현재 할당된 페이지 중 어느 것을 교체할지를 결정하는 알고리즘이다. LRU, FIFO(First In First Out), LFU(Least Frequently Used)가 있다.

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
46
47
48
#include <string>
#include <vector>
#include <iostream>
#include <map>
 
using namespace std;
 
int solution(int cacheSize, vector<string> cities) {
    int answer = 0;
    map<stringint> m;
    // 캐시 크기가 0인 경우
    if (cacheSize == 0return answer + (cities.size()*5);
    for (int i = 0; i < cities.size(); i++) {
        string tmp = "";
        for (int j = 0; j < cities[i].size(); j++) {
            if (cities[i][j]-'a' >= 0 && cities[i][j]-'a' <= 25) tmp += cities[i][j];
            else tmp += (cities[i][j]-'A')+'a';
        }
        cities[i] = tmp;
    }
    for (int i = 0; i < cities.size(); i++) {
        // 처음 입력된 캐시 등록
        if (m.find(cities[i]) == m.end()) {
            answer += 5;
            // 캐시용량이 부족할 때, 가장 오래 입력된 캐시 찾기
            if (m.size() == cacheSize) {
                auto min = 1e9;
                string tmp = "";
                for (auto it = m.begin(); it != m.end(); it++) {
                    if (min >= it->second) {
                        min = it->second;
                        tmp = it->first;
                    } 
                }
                m.erase(tmp);
                m.insert(make_pair(cities[i], i));
            }
            else m.insert(make_pair(cities[i], i));
        }
        // 캐시가 갱신되었을 때,
        else {
            answer += 1;
            m.erase(cities[i]);
            m.insert(make_pair(cities[i], i));
        }
    }
    return answer;
}
cs

반응형
Buy me a coffeeBuy me a coffee

댓글