Algorithm/1일 1코테

[프로그래머스 Python] 캐시 (from kakao)

대인보우 2020. 10. 16. 16:12
반응형

문제

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, Rome, Paris, Jeju, NewYork, Rome] 60 5 [Jeju, Pangyo, S

programmers.co.kr

 

내 답

1차 시도

# 정확도 80점으로 통과 X

def solution(cacheSize, cities):
    cache = [] # 캐시 생성
    time = 0

    if 0 < cacheSize: # 만약 캐시 사이즈가 0보다 크면
        for i, c in enumerate(cities): 
            c = c.lower() # 모두 소문자로 통일
            if cacheSize-1 < i : # 인덱스가 cache size보다 크고 (더이상 그냥 append X)
                if c in cache: # 캐시 안에 이미 c가 있으면
                    ci = cache.index(c) # 해당 인덱스를 찾아
                    cache.append(cache.pop(ci)) # 빼고, 다시 append (최신 사용이기 때문에)
                    time += 1
                else: # 해당 index가 없으면 
                    cache.pop(0) # 가장 사용 X인 첫번째 값 빼고 C append
                    cache.append(c)
                    time += 5
            else: # 인덱스가 cache size보다 작으면 그냥 append
                cache.append(c)
                time += 5
    else: # 캐시 사이즈가 0이면 다른 처리 없이 CITY수 * 5
        return len(cities) * 5
    return time

2차 시도

# 역시나 정확도 80점으로 통과 X
# 좀 더 가독성 좋게 수정

def solution(cacheSize, cities):
    
    cache = []
    time = 0

    # 만약 0이면 그냥 return
    if cacheSize == 0:
        return len(cities) * 5
    # 만약 0이 아니라면 
    else: 
        for i, c in enumerate(cities):
            c = c.lower()
            if c in cache:
                cache.pop(cache.index(c))
                cache.append(c)
                time += 1
            else:
                if i < cacheSize :
                    cache.append(c)
                    time += 5
                else:
                    cache.pop(0)
                    cache.append(c)
                    time += 5

    return time

3차 시도 > 통과

def solution(cacheSize, cities):
    
    cache = []
    time = 0

    # 
    if cacheSize == 0:
        return len(cities) * 5
    
    else: 
        for i, c in enumerate(cities):
            c = c.lower()
            if c in cache:
                cache.pop(cache.index(c))
                cache.append(c)
                time += 1
            else:
                if len(cache) < cacheSize : #len(cache)로 수정
                    cache.append(c)
                    time += 5
                else:
                    cache.pop(0)
                    cache.append(c)
                    time += 5

    return time

 

다른사람 풀이

def solution(cacheSize, cities):
    import collections
    cache = collections.deque(maxlen=cacheSize)
    time = 0
    for i in cities:
        s = i.lower()
        if s in cache:
            cache.remove(s)
            cache.append(s)
            time += 1
        else:
            cache.append(s)
            time += 5
    return time

데크 사용한 풀이 

인덱스 필요없이 해당 값 삭제가 가능하구만~~~~~~!!

반응형