Files
Coding-Practice/programmers/[1차] 캐시/solution.java
T

91 lines
3.7 KiB
Java
Raw Normal View History

2022-12-27 06:44:16 +09:00
// [문제 링크]: https://school.programmers.co.kr/learn/courses/30/lessons/17680
import java.util.HashMap;
class Solution {
public int solution(int cacheSize, String[] cities) {
HashMap<Integer,String> hs = new HashMap<>();
HashMap<Integer,Integer> hss = new HashMap<>();
int[] hsA = new int[cities.length];
int answer = 0, aIdx = 0, hit = 1, miss = 5, oa = 1;
boolean cc = false;
for(String c : cities){
c = c.toLowerCase();
int ccon = 0;
if(cacheSize == 0){
answer += miss;
continue;
}
while(cc==false){
// for(int a = 1; a <= cacheSize; a ++){
// if(hs.get(a) == null) {
int bcon = 0;
for(int cs = 1; cs <= Math.min(cacheSize, aIdx); cs ++){
if(hs.getOrDefault(hsA[aIdx-cs],"").equals(c)){
int x = hsA[aIdx-cs];
hs.put(x,c);
hss.put(x,aIdx);
for(int cb = aIdx-cs; cb > Math.max(aIdx - cacheSize,0); cb--){
// hss.put(hsA[cb-1],cb);
hsA[cb]=hsA[cb-1];
}
// System.out.println(aIdx+" "+x+" 초기중복");
hsA[aIdx++]=x;
answer += hit;
bcon = 1;
// oa--;
break;
}
}
if(bcon != 0) break;
ccon = oa;
hs.put(oa,c);
hss.put(oa,aIdx);
// System.out.println(aIdx+" "+oa+" 최초키입력");
hsA[aIdx++]=oa;
answer += miss;
if(oa++==cacheSize) cc = true;
break;
// }
// } // aIdx > cacheSize-1
}
if(ccon == 0 && cc){
int con = 0;
for(int cs = 1; cs <= cacheSize; cs++){
int a = cs;
if(hs.getOrDefault(hsA[aIdx-cs],"").equals(c)){
a = hsA[aIdx-cs];
con = a;
hs.put(a,c);
hss.put(a,aIdx);
for(int cb = aIdx-cs; cb > aIdx - cacheSize; cb--){
hss.put(hsA[cb-1],cb);
hsA[cb]=hsA[cb-1];
}
hsA[aIdx++]=a;
answer += hit;
break;
}
}
if(con==0){
int min = hss.get(1), mina = 1;
for(int a = 1; a <= cacheSize; a++){
if(min > Math.min(hss.get(a),min)){
min = Math.min(hss.get(a),min);
mina = a;
}
} // - for
// if(hss.get(a)==aIdx-cacheSize){
hs.put(mina,c);
hss.put(mina,aIdx);
// System.out.println(aIdx+" "+mina+" 교체");
hsA[aIdx++]=mina;
answer += miss;
// break;
// }
} // if not matched
} // if Last
} //Main for
return answer;
}
}