문제링크
https://programmers.co.kr/learn/courses/30/lessons/17680
문제 요약
지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다.
테스트 담당자가 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데,
제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다.
DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라난 난감한 상황이다
DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오.
< 입력 형식 >
- cacheSize의 도시이름 배열 cities를 입력받는다.
- cacheSize는 정수, 0이상 30이하
- cities는 도시 이름으로 이뤄진 문자열 배열, 최대 도시 수는 100,000개
- 각 도시 이름은 공백, 숫자, 특수문자 등이 없는 영문자로 구성 ( 대소문자 구분 없음 )
- 도시이름은 최대 20자
< 조건 >
- 캐시 교체 알고리즘은 LRU (Least Recently Used) 사용 -> 가장 사용한지 오래된 것을 제거
- cache hit일 경우 실행 시간은 1
- cache miss일 경우 실행 시간은 5
코드
func solution(_ cacheSize:Int, _ cities:[String]) -> Int {
var cache: [String] = []
var runtime: Int = 0
for city in cities {
let c = city.lowercased()
if cache.isEmpty {
cache.append(c)
runtime += 5
continue
} else if cacheSize == 0 {
runtime += 5
continue
}
if cache.contains(c) { // cache에 도시이름이 존재하는 경우 -> cache hit
runtime += 1
// 존재하는 경우 city를 cache 최 상단으로 옮기기
var index: Int = 0
for i in 0..<cache.count {
if cache[i] == c {
index = i
break
}
}
cache.remove(at: index)
cache.append(c)
} else { // 존재하지 않는 경우 -> cache miss
runtime += 5
if cache.count >= cacheSize { // cache가 꽉찬 경우
cache.removeFirst()
cache.append(c)
} else { // cache에 여유가 있는 경우
cache.append(c)
}
}
}
return runtime
}
틀린부분이 있거나, 더 좋은 방법이 있다면 댓글로 남겨주세요!
🌈댓글은 언제나 환영입니다🙏🏻
반응형
'CodingTest 문제풀이' 카테고리의 다른 글
[프로그래머스 L2] N개의 최소공배수 - swift (0) | 2021.09.30 |
---|---|
[프로그래머스 L2] 영어끝말잇기 - swift (0) | 2021.09.27 |
[프로그래머스 L2] 스킬트리 - swift (0) | 2021.09.03 |
[프로그래머스 L1] 문자열 내 마음대로 정렬하기 - swift (0) | 2021.08.20 |
[프로그래머스 L1] 문자열 내림차순으로 배치하기 - swift (2) | 2021.08.20 |