CodingTest 문제풀이

[프로그래머스 L2] [1차] 캐시 - swift

나른한코딩 2021. 9. 30. 15:19

 

문제링크

https://programmers.co.kr/learn/courses/30/lessons/17680

 

코딩테스트 연습 - [1차] 캐시

3 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "Jeju", "Pangyo", "Seoul", "NewYork", "LA"] 50 3 ["Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul"] 21 2 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "SanFrancisco", "Seoul", "Ro

programmers.co.kr

 

문제 요약

  지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다.

 테스트 담당자가 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데,

 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다.

 

 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
}

 

 

 

 

 

 

 

틀린부분이 있거나, 더 좋은 방법이 있다면 댓글로 남겨주세요! 
🌈댓글은 언제나 환영입니다🙏🏻

 



 

 

반응형