강의로 돌아가기
젊은광대

75점을 받았습니다. 제 소스를 수정해서 남은 25점을 더 받고 싶네요.

테스트 18 〉    실패 (13.02ms, 50.6MB)
테스트 19 〉    실패 (20.86ms, 46MB)
테스트 20 〉    실패 (15.54ms, 51.1MB)

인터넷으로 검색하지 않은 순수 제가 생각한 방법으로 짰습니다.
물론 제 로직에 문제가 있겠지만, 해당 문제를 파악하기 어렵습니다.

그렇다면 실제 18,19,20 번의 실 데이터가 어떤 데이터이며,
어떤 결과를 리턴해야하는지 알 수 있어야 제 문제점을 알 수 있을 거 같은데 보여지는 시스템이 없네요.

개발자마다 천차만별의 코딩을 할 것인데, 테스트한 예제값들이 어떤 것인지를 시스템적으로 알 수 없다면,
인터넷에 공유되어있는 완벽한 코드를 외워서 그대로 사용하라는 말과 같다고 생각합니다.
18,19,20 에 테스트 데이터가 어떤 데이터인지 궁금합니다.

작성중인 코드―Solution.java
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class Solution {

    // 가상의 캐시
    LinkedHashMap<String,Long> map = null;

    final static int CACHE_MISS = 5;
    final static int CACHE_HIT = 1;

    public int solution(int cacheSize, String[] cities) {
        int answer = 0;
        map = new LinkedHashMap<>();
        for (String citie:cities) {
            answer += solutionLRU(cacheSize, citie);
        }
        return answer;
    }

    // LFU는 가장 적은 참조시간을 갖는 페이지를 교체
    public int solutionLRU(int cacheSize, String citie) {
        if (cacheSize==0) return CACHE_MISS;
        citie = citie.toLowerCase();
        if(map.get(citie) != null) {
            map.put(citie,new Date().getTime());
            return CACHE_HIT;
        } else {
            if (map.size() >= cacheSize) {
                String deleteKey = null;
                for ( String key : map.keySet() ) {
                    if (deleteKey == null) {
                        deleteKey = key;
                    } else {
                        if(map.get(deleteKey) > map.get(key)){
                            deleteKey = key;
                        }
                    }
                }
                map.remove(deleteKey);
            }
            map.put(citie,new Date().getTime());
            return CACHE_MISS;
        }
    }


    // LFU는 가장 적은 참조횟수를 갖는 페이지를 교체
    public int solutionLFU(int cacheSize, String citie) {
        if (cacheSize==0) return CACHE_MISS;
        citie = citie.toLowerCase();
        if(map.get(citie) != null) {
            map.put(citie,map.get(citie)+1l);
            return CACHE_HIT;
        } else {
            if (map.size() >= cacheSize) {
                String deleteKey = null;
                for ( String key : map.keySet() ) {
                    if (deleteKey == null) {
                        deleteKey = key;
                    } else {
                        if(map.get(deleteKey) > map.get(key)){
                            deleteKey = key;
                        }
                    }
                }
                map.remove(deleteKey);
            }
            map.put(citie,1l);
            return CACHE_MISS;
        }
    }

    public static void main(String[] args) {

        Solution sl = new Solution();
        String[] cities = {"Jeju", "Pangyo", "NewYork","Jeju", "Aewyork","ANewYork", "Jeju","NewYork", "Jeju","Aewyork", "Jeju","Pangyo"};
        System.out.println(
        sl.solution(4, cities));


    }

}
0 개의 답변
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.