티스토리 뷰

문제

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

풀이

  1. 조건
    • cacheSize는 0이상 30이하
    • cities는 1이상(문제가 돌아갈려면 1개이상은 들어올것이다) 100000이하
    • cities의 값은 최대 20자, 영문자로 구분, 대/소 구분을 하지않음
  2. 예제  
    캐시크기(cacheSize) 도시이름(cities)  실행시간
    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", "Rome", "Paris", "Jeju", "NewYork", "Rome"] 60
    5 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "SanFrancisco", "Seoul", "Rome", "Paris", "Jeju", "NewYork", "Rome"] 52
    2 ["Jeju", "Pangyo", "NewYork", "newyork"] 16
    0 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA"] 25
  3. 예제 해석
    • 1,2번 예제 - 캐시는 같고 도시 수에 따른 처리
    • 3,4번 예제 - 도시 수는 같고 캐시 크기에 따른 처리
    • 5번 예제 - 대/소문자가 다르지만 같은 도시가 들어올 수 있음 ( 대/소 문자를 구별하지 않는 방법 처리 )
    • 6번 예제 - 캐시의 크기가 0일 수 있음 ( 캐시크기가 0일때 처리 )
  4. 소스 작성
    • 캐시를 배열로 구성하고 해당 배열은 큐로 활용한다. 예제 해석에 따른 케이스를 분류하고 반복문과 조건문을 배치 하면 쉽게 풀리는 방식
    • LRU(Least Recently Used) : 가장 오래 참조하지 않은 내용을 삭제하고 최근에 참조한 내용을 저장하는 방식
    • cache hit : 캐시에 참조할 내용이 들어있는 경우, 시간만 더 하고 넘어가면 됨
    • cache miss : 캐시에 참조할 내용이 들어있지 않는 경우, 시간을 더하고 캐시를 정리해야함

 

전체코드

import Foundation

func solution(_ cacheSize:Int, _ cities:[String]) -> Int {
    let cities = cities.map { $0.uppercased() }
    var cacheCities: [String] = [String](repeating: "", count: 0)
    var totalTime: Int = 0
    
    if cacheSize == 0 { // 1. 캐시 사이즈가 0이면 도시수 * 5
        totalTime = cities.count * 5
    }else {
        for city in cities {
            // 2. city가 캐시에 들어있는지 확인
            var check: Bool = false //캐시에 들어있으면 true, 없으면 false
            for cacheCity in cacheCities.enumerated() {
                if city == cacheCity.element { // 3. city가 캐시에 들어있음
                    totalTime += 1
                    cacheCities.remove(at: cacheCity.offset) // 기존의 내용을 삭제
                    cacheCities.append(cacheCity.element) // 캐시를 새롭게 정리
                    check = true
                    break
                }
            }
            if !check { //캐시에 들어있지않으면
                totalTime += 5
                if cacheCities.count == cacheSize { // 캐시가 가득찾으면 가장 처음에 넣은 캐시 값 삭제
                    cacheCities.removeFirst()
                }
                cacheCities.append(city) // 캐시에 저장
            }
        }
    }
    return totalTime
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함