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
이 문제를 풀면서 생각한 논리적 흐름
- LRU의 특성에 따라 정해진 chacheSize에 맞춰 array의 사이즈를 유지했다.
- cacheSize보다 array 내의 카운트 값이 커질 경우 가장 먼저 들어왔던 데이터를 삭제하고 새로운 데이터를 삽입한다.
- 모든 도시를 한 번씩 훑을 때 이 도시가 array내에 포함된 값이라면 +1, 포함되지 않은 값이라면 +5 점 해준다.
- 이 떄 중요한건 내가 놓쳤던 부분이다.
- 첫 번째로 cities 명을 lower 혹은 upper case로 바꾸어주어야 했다는 점이다.
- 두 번째로 cahceSize가 0인 경우도 있다는 점이다.
- 세 번재로 array내에 있는 원소가 호출 되었을 때 array를 그대로 두면 안되고 언급된 원소를 맨 앞으로 빼줘야한다는 것이다.
- 위 세가지 사항을 모두 고려하여 코드를 여러번 수정하였더니 답이 나왔다.
* 코드
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)
- array에서 remove 메서드를 사용하는 것은 나에게 은근히 까다로운 일이다. 특정 String 혹은 원소를 지우고 싶은 경우와 index에 맞게 지우는 경우가 자꾸 혼동이 온다.
- 또한 이렇게 직접적으로 알고리즘 명칭을 제시하고(LRU) 이를 이용하여 해결하라는 문제는 처음이었다. 알고리즘을 알고 있다면 찾아보지도 않고 금방 풀었을 문제였을 것 같다. 알고리즘 이론 공부도 착실히!
'TIL > 알고리즘 공부' 카테고리의 다른 글
프로그래머스 Lv. 2 Swift 알고리즘 - 괄호 회전하기 (0) | 2023.01.05 |
---|---|
프로그래머스 Lv. 2 Swift 알고리즘 - 행렬의 곱셈 (0) | 2023.01.05 |
프로그래머스 Lv. 2 Swift 알고리즘 - H-Index (0) | 2023.01.04 |
프로그래머스 Lv. 2 Swift 알고리즘 - 멀리 뛰기 (0) | 2023.01.03 |
프로그래머스 Lv. 2 Swift 알고리즘 - 점프와 순간 이동 (0) | 2023.01.03 |