https://programmers.co.kr/learn/courses/30/lessons/17680?language=swift 

 

코딩테스트 연습 - [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

 

원트에 성공할 줄 알았으나... 실패해서 왜 그런지 봤더니 이미 cache에 있는 경우를 생각하지 못했다.

실제 알고리즘 문제를 풀러 갔으면 fail 했을 문제라는 뜻. 

아무튼 해당 예외 케이스만 잘 잡아주면 별 무리 없이 풀 수 있는 문제다.

 

풀이 로직은 이렇다.

     1. 하나씩 돌면서 for city in cities
       1-1. cache에서 현재 city가 있는지 확인 
       1-2. 있으면 + 1, 없으면 + 5
     2. cache를 추가.
       2-1. cacheSize가 가득 찼다면 
         2-1-1. cacheSize가 0이면 그냥 지나가기.
         2-1-2. caches가 이미 city를 가지고 있는 경우 caches에서 해당 city를 remove하고 맨 뒤에 appen
         2-1-3. else removeFirst() 후 append
     2-2. 가득 차지 않았다면 그냥 append

 

정답코드:

func solution(_ cacheSize:Int, _ cities:[String]) -> Int {
    var cities = cities.map({$0.uppercased()})
    var caches = [String]()
    var answer = 0
    
    for city in cities {
        if caches.contains(city) { answer += 1 }
        else { answer += 5 }
        if caches.count >= cacheSize {
            if cacheSize != 0 { // cacheSize가 0이면 removeFirst()에서 error
                if caches.contains(city) {
                    for (i, e) in caches.enumerated() {
                        if e == city {
                            caches.remove(at: i)
                            caches.append(city)
                            break;
                        }
                    }
                } 
                else {
                    caches.removeFirst()
                    caches.append(city)
                }
            }
        } else {
            caches.append(city)
        }
    }
    
    
    return answer
}

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom