본문 바로가기

알고리즘

프로그래머스 - 캐시(실패)

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

음.. 말도 안되게 이상하게 푼 것 같아서 다시 풀러 갈겁니다...  95점이에요 그리고 ㅜ

import java.util.*;

class Solution {
  public int solution(int cacheSize, String[] cities) {
      int answer = 0; int idxOf = 0;
      int idx = 0; int min = 0; int cacheCount = 0;
      int[] cacheIdx = new int[cacheSize];
      String[] cache = new String[cacheSize];
      int check=0;
      if(cacheSize == 0){
          return cities.length * 5;
      }
      
     
      for(int i=0; i<cities.length; i++){
          if(!Arrays.asList(cache).contains(cities[i].toUpperCase())){ // cache miss
              answer += 5;
              // 여기부터는 캐시가 교체 되어야 한다.
              if(cacheCount == cacheSize){
                  for(int j=0; j<cacheIdx.length; j++){
                      if(0 == cacheIdx[j]){
                          min = j; // 최소값의 idx를 지정
                      }
                  }
                  cache[min] = cities[i].toUpperCase(); 
                  cacheIdx[min] = cacheSize;
                  
                  for(int k=0; k<cacheIdx.length; k++){
                      if(cacheIdx[k] == 0){}
                      else {
                          cacheIdx[k] -= 1;
                      }
                      
                  }
              } else { // 처음에 캐시를 채울 때, 이 때 동일한게 들어오는 경우는 따로 에러 처리 해줘
                  cache[idx] = cities[idx].toUpperCase();
                  cacheIdx[idx] = idx;
                  cacheCount++;
                  idx++;
              }
              
           
          } else { // cache hit
              answer += 1;
              for(int n = 0; n<cacheCount; n++){
                  if(cache[n].equals(cities[i].toUpperCase())){
                      idxOf = n;
                  }
              }       
              if(cacheCount == cacheSize){
                  check = cacheIdx[idxOf];
                  cacheIdx[idxOf] = cacheSize;
              } else {
                  cacheIdx[idxOf] = idx;
                  for(int j=0; j<cacheIdx.length; j++){
                      if(0 == cacheIdx[j]){
                          min = j; // 최소값의 index를 지정
                      }
                  }
              }
              
              for(int k=0; k<cacheCount; k++){
                      // if(cacheIdx[k] == 0){} 
                      // else {
                      //     cacheIdx[k] -= 1;
                      // }
                  if(check < cacheIdx[k])
                      cacheIdx[k] -= 1;
              }
          }
      }
      return answer;
      }
}