문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/17680#
접근방법
가장 먼저 들어온 요소 순서로 배열에 저장해주고, 배열에 존재하는지 확인한다.
예를 들어 캐시 크기가 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 |