본문 바로가기
알고리즘/프로그래머스

[Lv.2] 캐시

by SeungYn 2023. 5. 12.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 해결 전략보다는 코드 리팩토링에 초점을 맞춤

 

리팩토링 전 코드

function solution(cacheSize, cities) {
    var answer = 0;
    let q = [];
    
    for(let city of cities){
        city = city.toLowerCase();
        
        if(q.includes(city)){ // 캐시에 있는 경우
            const swapIndex = q.findIndex(i=> i === city);
            if(swapIndex > -1){
               q = [...q.slice(0, swapIndex) , ...q.slice(swapIndex + 1), q[swapIndex]]; // 캐시된 아이템을 뒤로 보내는 작업
            }
            
            answer+=1;
        }else{ //캐시에 없는 경우
            answer+=5;
            if(cacheSize === 0){ // 캐시사이즈가 0인경우
                continue;
            }
            
            if(q.length >= cacheSize){ // 캐시에 꽉차면 가장 LRU 알고리즘에 따라 가장 오랫동안 참조 하지 않는 아이템 제거 후 추가
                q.shift();
                q.push(city);
                
            }else{ // 캐시에 자리가 남으면 그냥 추가
                q.push(city);
            }
            
        }
     
    }
    
    return answer;
}

 

리팩토링 후 코드

function solution(cacheSize, cities) {
    var answer = 0;
    const HIT = 1, MISS = 5;
    
    if(cacheSize === 0) return cities.length * MISS;
    
    let q = [];
    
    for(let city of cities){
        city = city.toLowerCase();
        
        const cacheIndex = q.indexOf(city);
        if(cacheIndex>-1){
            q.splice(cacheIndex, 1);
            answer += HIT;
        }else{
            if(q.length >= cacheSize) q.shift();
            answer += MISS;
        }
        q.push(city);
        
        
     
    }
    
    return answer;
}

아래 사진으로 보면 왼쪽이 리팩토링 전, 오른쪽이 리팩토링 후 코드인데 색깔 블럭으로 맵핑해 놨다.

리팩토링 전, 후 맵핑

초랙색 박스: 캐시 HIT 부분인데 나는 q.includes로 캐시 HIT인지 확인 후 해당 인덱스를 찾고 그 인덱스를 제외한 q를 다시 초기화했다.

하지만 리팩토링 부분을 보면 indexOf 메서드로 캐시 HIT 여부를 찾고 splice 메서드로 캐시 된 아이템의 위치를 바꿔줬다.

빨간색 박스: 캐시 MISS 부분인데 별차이가 없지만 캐시 사이즈가 0 체크를 안에 두고 캐시에 qush 하는 로직도 두 번이나 작성했다. 오른쪽을 보면 간소화 돼있다. 그 이유는 캐시 HIT를 하든 MISS를 하든 둘 다 결국 q에 push를 해주는데 그 공동 로직을 밖으로 빼서 한 번만 작성하도록 돼있다.

노란색 박스: 나는 캐시사이즈가  0 확인 로직은 빨간 박스 내부에다 했고 오른쪽은 외부에서 초반 부분에 걸러지도록 하였다. 이로써 리팩토링 전 코드는 for을 계속 돌면서 확인하는데 리팩토링 후 코드는 처음에 확인해서 로직이 단순화되었다.

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[레벨 1] 신고 결과 받기 Javascript  (0) 2023.04.14