๐ ๋ฌธ์ ๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/17680
๐ ๋์ ํ์ด
์ฐ์ LRU ์๊ณ ๋ฆฌ์ฆ์ ๋ํด์ ์์์ผํ๋ค. ์ง์ง ๋ง์นจ,, ๋ง์นจ,, ์ค๋ ์์นจ์ CS ์คํฐ๋๋ฅผ ํ๋๋ฐ ๊ฑฐ๊ธฐ์ LRU ์๊ณ ๋ฆฌ์ฆ์ด ๋์๋ค. ๊ทผ๋ฐ ์์ธํ ์ค๋ช ์... ์์ง ์ดํดํ์ง ์๊ณ ๋์ด๊ฐ ์ํ๋ค.. ๊ทผ๋ฐ ๋ฐ๋ก๋์ ๋ฒ๋ฆฌ๋ค๋!!
LRU๋ ํ์ด์ง ๊ต์ฒด ์๊ณ ๋ฆฌ์ฆ์์ ๋ฑ์ฅํ ๊ฐ๋
์ด์๋ค.
๊ฐ๋
์ Least Recently Used๋ก, ๊ฐ์ฅ ์ค๋ซ๋์ ์ฌ์ฉ๋์ง ์์ ํ์ด์ง๋ฅผ ๊ต์ฒดํ๋ ๋ฐฉ์์ด๋ค. ํ๋ก ๊ตฌํ๋๋ ๋ฐฉ์์ด๊ณ , ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฅผ ํ์์ ์ง์ฐ๊ณ ๋งจ ์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ฌ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์งํ๋๋ค. ๋ง์ฝ ํ๋ ์์ ๊ธธ์ด๊ฐ ๋ชจ์๋ ๊ฒฝ์ฐ, ๊ฐ์ฅ ์๋์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค.
์ด๊ฒ ํ์ด์ง ๊ต์ฒด ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์์ฃผ ์ฌ์ฉ๋๋๋ฐ, Cache ์์๋ ์ฌ์ฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ์บ์์์ ์ฌ์ฉ ๊ณต๊ฐ์ด ๋ถ์กฑํ ๋, ๊ฐ์ฅ ์ค๋ซ๋์ ์ฌ์ฉ๋์ง ์์ ํญ๋ชฉ์ ์ ๊ฑฐํ๊ณ , ์๋ก์ด ๋ ์์ ๋ฐฐ์นํ๋ ํ์์ผ๋ก ๋์๋๋ค.
๊ทธ๋ผ, ์ด๊ฑธ ์ด๋ป๊ฒ ๊ตฌํํ๋๋? LRU๊ฐ ๋์ํ๋ ๋ฐฉ์์ ์์ ์ฃผํฉ ๊ธ์จ๋ก ๊ฐ๋จํ๊ฒ ์ค๋ช ํด๋์๋ค. ๊ทผ๋ฐ ์ดํด๊ฐ ์ ์๊ฐ๋, ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ ค๋ณด์.
๋ง์ฝ Cache Size ๊ฐ 3์ด๊ณ , [1, 2, 1, 3, 4, 1, 2, 4]๊ฐ ์ฐธ์กฐ๊ฐ์ด๋ผ๊ณ ์น์. ๊ทธ๋ผ LRU ์๊ณ ๋ฆฌ์ฆ์ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๋ค.
๋ณด๋ฉด, Caeche Hit ์ด๋ฉด, ๊ธฐ์กด์ ์๋ ํด๋น ๊ฐ์ ์ญ์ ํ๊ณ , ๋งจ ์ Head์ ๊ทธ ๊ฐ์ ๋ฃ๋๋ค. ๋ง์ฝ, Miss ์ด๋ฉด, ๊ทธ๋ฅ ๊ฐ์ฅ ์ต๊ทผ๊ฐ์ Head ์ ๋ฃ๊ณ , ๋ง์ฝ ๋ฉ๋ชจ๋ฆฌ์ size๊ฐ 3์ด ๋์ด๊ฐ๋ฉด, ๊ฐ์ฅ ์ฒ์์ ๋ค์ด๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ฉด์ ๊ธธ์ด 3์ ์ ์งํ๋ค.
์ฌ์ค ๊ทธ๋ฆผ์ฒ๋ผ, Caeche ๋ ์ค์ ๋ก Linked List (head์ tail์ด ์๋ ๊ตฌ์กฐ)๋ก ๊ตฌํ๋์ด์๋ค๊ณ ํ๋ค. ๊ทธ๋์ ๋๋ ์ด ๋ฌธ์ ๋ฅผ Linked List๋ก ํ์ด์ผํ ๊น? ๊ณ ๋ฏผํ๋๋ฐ, ๊ทธ๋ ๊ฒ ํ๊ฒ ๋๋ฉด ์ฝ๋๊ฐ ๋๋ฌด ๋ณต์กํด ์ง๊ฒ ๊ฐ์์, ๊ทธ๋ฅ ๋จธ๋ฆฌ์ ์ธ์ด ๋ก์ง์ ๊ทธ๋๋ก for๋ฌธ๊ณผ if๋ฌธ์ ์ฌ์ฉํด์ ๊ตฌํํ๋ค.
๐ ์ ๋ต์ฝ๋
import Foundation
func solution(_ cacheSize:Int, _ cities:[String]) -> Int {
let newCitiies = cities.map {
return $0.lowercased()
}
var cacheArray = [String]()
var totalTime = 0
for city in newCitiies {
// cache hit
if cacheArray.contains(city) {
totalTime += 1
cacheArray.remove(at: cacheArray.firstIndex(of: city)!)
cacheArray.append(city)
} else { // cache miss
totalTime += 5
cacheArray.append(city)
if cacheArray.count > cacheSize {
cacheArray.removeFirst()
}
}
}
return totalTime
}