TIL/알고리즘 공부

프로그래머스 Lv. 2 Swift 알고리즘 - [1차] 캐시

여의도사노비 2023. 1. 4. 17:18
728x90

엄청 오래 걸릴 것 같아 걱정이 많았지만

오히려 LRU의 특성에 대해 찾아보니 어떻게 풀지 대충 감이 왔다.

 

이 문제를 풀기전에 무조건 LRU 개념을 살펴보는 것이 좋을 것 같다.

(참고한 블로그: https://haningya.tistory.com/386)

 

LRU cache (Swift)

LRU Cache - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com cache 가 full 이면 가장 오래전에 사용한 애를 cache 에서 쫒아

haningya.tistory.com

 

 

이 문제를 풀면서 생각한 논리적 흐름

  1. LRU의 특성에 따라 정해진 chacheSize에 맞춰 array의 사이즈를 유지했다.
  2. cacheSize보다 array 내의 카운트 값이 커질 경우 가장 먼저 들어왔던 데이터를 삭제하고 새로운 데이터를 삽입한다.
  3. 모든 도시를 한 번씩 훑을 때 이 도시가 array내에 포함된 값이라면 +1, 포함되지 않은 값이라면 +5 점 해준다.
  4. 이 떄 중요한건 내가 놓쳤던 부분이다.
    1. 첫 번째로 cities 명을 lower 혹은 upper case로 바꾸어주어야 했다는 점이다.
    2. 두 번째로 cahceSize가 0인 경우도 있다는 점이다.
    3. 세 번재로 array내에 있는 원소가 호출 되었을 때 array를 그대로 두면 안되고 언급된 원소를 맨 앞으로 빼줘야한다는 것이다.
  5. 위 세가지 사항을 모두 고려하여 코드를 여러번 수정하였더니 답이 나왔다.

 

 

* 코드

func solution(_ cacheSize:Int, _ cities:[String]) -> Int {
    let lowerCaseCities = cities.map{String($0).lowercased()}
    var array: [String] = []
    var answer = 0

    if cacheSize == 0 {
        return cities.count * 5
    }

    for i in 0...lowerCaseCities.count-1 {
        if array.count < cacheSize {
            if array.contains(lowerCaseCities[i]) {
                array.remove(at: array.firstIndex(of: lowerCaseCities[i])!)
                answer += 1
            } else {
                answer += 5
            }
            array.append(lowerCaseCities[i])
        } else {
            if array.contains(lowerCaseCities[i]) {
                array.remove(at: array.firstIndex(of: lowerCaseCities[i])!)
                answer += 1
            } else {
                answer += 5
                array.removeFirst()
            }
            array.append(lowerCaseCities[i])
        }
    }
    return answer
}

 

 

정리(Today I Learned)

  1. array에서 remove 메서드를 사용하는 것은 나에게 은근히 까다로운 일이다. 특정 String 혹은 원소를 지우고 싶은 경우와 index에 맞게 지우는 경우가 자꾸 혼동이 온다. 
  2. 또한 이렇게 직접적으로 알고리즘 명칭을 제시하고(LRU) 이를 이용하여 해결하라는 문제는 처음이었다. 알고리즘을 알고 있다면 찾아보지도 않고 금방 풀었을 문제였을 것 같다. 알고리즘 이론 공부도 착실히!