유블로그

[프로그래머스] 캐시 Java 본문

알고리즘

[프로그래머스] 캐시 Java

yujeong kang 2021. 1. 29. 21:29

[프로그래머스] level2 캐시

 

소요시간 : 14분

 

LRU를 어떻게 구현해야하나에 생각을 많이 했다.

뭔가 flag 같은 걸로 할 수 있을 것 같았는데

일단 그냥 배열을 움직이는 방법으로 했다.

 

캐시크기만큼 string 배열 만들어서

캐시hit면 그 도시를 맨 앞으로 당기고(위치만 바꾼다)

miss면 캐시 맨 끝에 있는 도시 없애고 모든 도시를 한 칸씩 뒤로 밀어서 맨 앞에 도시를 추가한다.

 

난 이 작업을 수작업으로 인덱스조절해서 했는데..

풀고나서 다른 사람 풀이를 보니 list remove add 로 풀었더라.. ㅎ

list.remove(0) 과 원래 있던 도시는 list.remove() 후 다시 list.add 방식으로........wow 

로직은 같지만 코드가 훨씬 간결하다.

난 언제쯤~

 

class Solution {
  public int solution(int cacheSize, String[] cities) {
    int answer = 0;
    if(cacheSize > 0) {
      String[] cache = new String[cacheSize];
      for (int i = 0; i < cacheSize; i++) {
      	cache[i] = "";
      }
      for (int i = 0; i < cities.length; i++) {
        boolean isFind = false;
        for (int j = 0; j < cacheSize; j++) {
          if(cache[j].equalsIgnoreCase(cities[i])) {
            answer++;
            for (int k = j; k >= 1; k--) {
            cache[k] = cache[k-1];
            }
            cache[0] = cities[i];
            isFind = true;
            break;
          }
        }
        if(!isFind) {
          answer += 5;
          for (int k = cacheSize-1; k >= 1; k--) {
          	cache[k] = cache[k-1];
          }
          cache[0] = cities[i];
        }
      }
    }
    else {
    	answer += cities.length * 5;
    }
    return answer;
  }
}

 

list로 또 풀었다. 훨씬 간결하고 읽기 쉬운 코드인 듯!

import java.util.ArrayList;
import java.util.List;

class Solution {
  public int solution(int cacheSize, String[] cities) {
    int answer = 0;
    if(cacheSize > 0) {
      List<String> list = new ArrayList<>();
      for (int i = 0; i < cities.length; i++) {
        cities[i] = cities[i].toLowerCase();
        if(list.contains(cities[i])) {
          list.remove(cities[i]);
          list.add(cities[i]);
          answer++;
        }
        else {
          if(list.size() == cacheSize) list.remove(0);
          list.add(cities[i]);
          answer += 5;
        }
      }
    }
    else {
    	answer += cities.length * 5;
    }
    return answer;
  }
}