[Programmers]캐시/JS

문제링크

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

 

프로그래머스

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

programmers.co.kr

 

접근방법

가장 먼저 들어온 요소 순서로 배열에 저장해주고, 배열에 존재하는지 확인한다.

예를 들어 캐시 크기가 2이고 ["Jeju", "Pangyo", "Jeju", "Seoul"]이 들어오면

["Jeju", "Pangyo"] 순서로 저장하고, 

그 다음 들어오는 Jeju를 뒤에 저장해준 뒤 제일 앞의 Jeju를 빼준다 -> ["Pangyo", "Jeju"]

Seoul이 들어오면 제일 뒤에 저장해주고 제일 앞의 Pangyo를 빼주면 된다 -> ["Jeju", "Seoul"]

 

실패코드

function solution(cacheSize, cities) {
    var answer = 0;
    let cache = [];
    
    for(let i=0;i<cities.length;i++){
        let upperCity = cities[i].toUpperCase();

        if(i<cacheSize) {
            cache.push(upperCity);
            answer+=5;
            continue;
        }
        if(cache.includes(upperCity)){
            cache.splice(cache.indexOf(upperCity), 1);
            cache.push(upperCity);
            answer+=1;
            continue;
        }
        cache.splice(0, 1);
        cache.push(upperCity);
        answer+=5;
    }
    return answer;
}

cache 크기보다 작은 경우에는 그냥 무조건 캐시에 넣어줬다.

cache 크기가 입력되는 cities보다 큰 경우를 고려해주지 못한 것이다.

cacheSize가 5이고, cities=["a", "b", "c", "a"]인 경우를 고려해서

코드를 수정했더니 통과가 됐다.

 

정답코드

function solution(cacheSize, cities) {
    var answer = 0;
    let cache = [];		// 캐시로 사용할 배열
    
    for(let i=0;i<cities.length;i++){
    	// 대소문자 구분하지 않기 때문에 대문자로 저장
        let upperCity = cities[i].toUpperCase();
		// 캐시 hit인 경우
        if(cache.includes(upperCity)){
        	// 캐시 갱신 -> 가장 뒤로 넣어줌
            cache.splice(cache.indexOf(upperCity), 1);
            cache.push(upperCity);
            answer+=1;
            continue;
        }
        // 캐시 miss인 경우
        cache.push(upperCity);
        // 캐시가 가득 찬 경우, 가장 앞(제일 먼저 들어왔던)의 도시 제거
        if(cache.length>cacheSize){
        cache.splice(0, 1);
        }
        answer+=5;
    }
    return answer;
}

 

느낀점

어려운 문제는 아니였는데 문제에 나와있는 입출력 예제들만 보고 풀었더니 실패가 떴다.

입출력 예제뿐만 아니라 다른 예외의 경우도 고려해줘야 했는데 생각해내지 못해서 아쉽다.

예외를 잘 생각해내자!!

'Programmers' 카테고리의 다른 글

[Programmers]산 모양 타일링[JS]  (0) 2024.04.13
[Programmers]야근 지수/JS  (5) 2024.04.07
[Programmers]등굣길/JS  (2) 2024.04.04
[Programmers]다트 게임/JS  (8) 2024.03.29
[Programmers]롤케이크 자르기/JS  (0) 2024.02.24