GaGe

[프로그래머스] 2018 KAKAO BLIND RECRUITMENT [1차] 캐시 - java 본문

알고리즘/[2020] 프로그래머스

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

Sorrel 2020. 4. 17. 20:41

프로그래머스 구글링 안 하고 혼자 힘으로 2시간 반동안 걸림! 뿌듯하다!

이해가 안 가는 부분이 있으면 댓글로 문의해주세요

import java.util.LinkedList;
class Solution {
  public int solution(int cacheSize, String[] cities) {
      int answer = 0;
      LinkedList <String> lru = new LinkedList<String>();
      int size= 0;
      int time=0;
      
      for(int i =0; i<cities.length; i++){
          if(cacheSize==0){ //캐쉬 사이즈가 0이면
              time=cities.length*5;
              
          }
          else if(cacheSize>0){//캐쉬 사이즈가 0보다 크다면
              if(size==0){ //캐쉬가 비어있다면
                  lru.add(cities[i]);
                  time++;
                  size++;
              }
              else{ //캐쉬가 비어있지 않다면
                  boolean flag = false; //캐쉬 안에 해당 city가 이미 있었는지 없었는지의 flag
                  for(int j =0; j<lru.size(); j++){
                      if(lru.get(j).equalsIgnoreCase(cities[i])){ //대소문자 구분 없이 있으면
                          lru.remove(j); //원래 있던 거 지우고
                          lru.add(cities[i]); //새로운 거 넣고
                          time++; //cache hit
                          flag=true; //있었다
                          break;
                      }
                  }
                  if(flag==false){ //만약 이미 city가 캐쉬에 없었으면
                      if(size<cacheSize){ //캐쉬 공간이 남으면
                          lru.add(cities[i]); //그냥 넣고
                          size++;
                          time++;
                      }
                      else{ //남은 공간이 없으면
                          lru.pop(); //오래된 거 하나 지우고
                          lru.add(cities[i]); //city 넣기
                          time+=5;//cache miss
                      }
                  }
                  
              }
          }
          
          // System.out.println(lru);
      }
      time+=cacheSize*4; //<<<이 부분이 왜인지 아직 모르겠다. LRU에 대해 더 찾아보자
      answer=time;
      return answer;
  }
}

 

 

아래는 문제풀면서 고쳐왔던 코드들 (순서X)

import java.util.LinkedList;
class Solution {
  public int solution(int cacheSize, String[] cities) {
      int answer = 0;
      LinkedList <String> lru = new LinkedList<String>();
      int size= 0;
      int time=0;
      
      for(int i =0; i<cities.length; i++){
          if(cacheSize==0){ //캐쉬 사이즈가 0이면
              time=cities.length*5;
          }
          else if(cacheSize>0){//캐쉬 사이즈가 0보다 크다면
              if(size==0){ //캐쉬가 비어있다면
                  lru.add(cities[i]);
                  size++;
              }
              else{ //캐쉬가 비어있지 않다면
                  boolean flag = false;
                  for(int j =0; j<lru.size(); j++){
                      if(lru.get(j).equalsIgnoreCase(cities[i])){
                          lru.remove(j);
                          lru.add(cities[i]);
                          flag=true;
                          break;
                      }
                  }
                  if(flag==false){
                      if(size<cacheSize){
                          lru.add(cities[i]);
                          size++;
                      }
                      else{
                          lru.pop();
                          lru.add(cities[i]);
                      }
                  }
                  
              }
          }
          System.out.println(lru);
      }
      return answer;
  }
}
import java.util.LinkedList;
class Solution {
  public int solution(int cacheSize, String[] cities) {
      int answer = 0;
      LinkedList <String> lru = new LinkedList<String>();
      int size= 0;
      int time=0;
      
      for(int i =0; i<cities.length; i++){
          if(cacheSize==0){ //캐쉬 사이즈가 0이면
              time=cities.length*5;
          }
          else if(cacheSize>0){//캐쉬 사이즈가 0보다 크다면
              if(size==0){ //캐쉬가 비어있다면
                  lru.add(cities[i]);
                  size++;
              }
              else{ //캐쉬가 비어있지 않다면
                  if(lru.contains(cities[i])){ //캐쉬 안에 이미 값이 있는지 탐색
                      int j=0;
                      while(j<lru.size()){
                          if(lru.get(j)==cities[i]){
                              break;
                          }
                          else{
                              j++;
                              continue;
                          }
                      }
                      lru.remove(j);
                      lru.add(cities[i]);
                      size++;
                  }
                  else{ //캐쉬 안에 해당 값이 없다면
                      if(size<cacheSize){
                          lru.add(cities[i]);
                          size++;
                      }
                      else{
                          lru.pop();
                          lru.add(cities[i]);
                          size++;
                      }
                  }
              }
          }
          System.out.println(lru);
      }
      return answer;
  }
}
Comments