안녕하세요! 오늘은 프로그래머스 캐시 문제를 풀어보도록 하겠습니다.
캐시 문제는 LRU 알고리즘을 이용하여 문제를 해결하라고 나와있는데요!
LRU 알고리즘에 대해서 간단히 소개하자면 가장 최근에 쓰인 데이터를 캐시에 담아두는 것입니다.
기본적으로 캐시는 queue형태로 이루어져있지만 캐시 hit인 경우에는 해당 캐시만 뒤로 이동됩니다.
이제 문제를 풀어보겠습니다!
우선 사용할 캐시큐와 실행시간을 선언해줍니다!
var cacheQueue:[String] = [String]()
var executeTime:Int = 0
대소문자와 상관없으니 모두 대문자로 취급하고 for문으로 입력을 해줍니다.
for city in cities {
let city = city.uppercased()func solution(_ cacheSize:Int, _ cities:[String]) -> Int {
}
캐시큐가 비어있지 않을때는 캐시히트냐 캐시미스냐에 따라 구분을 지어줍니다.
또한, 히트일 경우 캐시의 자리를 바꾸기 위해 index를 지정해줍니다.
if !cacheQueue.isEmpty {
var cacheHit:Bool = false
var index:Int = 0
for data in cacheQueue {
if data == city {
cacheHit = true
break
}
index += 1
}
}
캐시 히트일 경우에는 해당 캐시를 맨 뒤로 옮겨줍니다.
캐시 미스일 경우에는 캐시에 push, pop합니다.
if cacheHit {
cacheQueue.remove(at: index)
cacheQueue.append(city)
executeTime += 1
}
else {
cacheQueue.append(city)
if cacheQueue.count > cacheSize {
cacheQueue.removeFirst()
}
executeTime += 5
}
func solution(_ cacheSize:Int, _ cities:[String]) -> Int {
var cacheQueue:[String] = [String]()
var executeTime:Int = 0
for city in cities {
//search Cache Memory
let city = city.uppercased()
if !cacheQueue.isEmpty {
var cacheHit:Bool = false
var index:Int = 0
for data in cacheQueue {
if data == city {
cacheHit = true
break
}
index += 1
}
if cacheHit {
cacheQueue.remove(at: index)
cacheQueue.append(city)
executeTime += 1
}
else {
cacheQueue.append(city)
if cacheQueue.count > cacheSize {
cacheQueue.removeFirst()
}
executeTime += 5
}
}
else {
cacheQueue.append(city)
if cacheQueue.count > cacheSize {
cacheQueue.removeFirst()
}
executeTime += 5
}
}
return executeTime
}
오늘은 여기까지이며 질문이 있으시면 댓글로 남겨주세요!
오늘도 좋은 하루 되세요!
'Algorithm Problem Solving > Programmers' 카테고리의 다른 글
[프로그래머스] 월간 코드 챌린지 시즌1 이진 변환 반복하기 with Swift (0) | 2022.03.04 |
---|---|
[프로그래머스] 위클리 챌린지 전력망을 둘로 나누기 with Swift (0) | 2022.02.12 |
[프로그래머스] 위클리 챌린지 교점에 별 만들기 with Swift (0) | 2022.02.10 |
[프로그래머스] Summer/Winter Coding(~2018) 영어 끝말잇기 with Swift (0) | 2022.02.04 |
[프로그래머스] 월간 코드 챌린지 시즌1 삼각 달팽이 with Swift (0) | 2022.01.29 |