프로그래머스의 다른 유저가 Map()을 이용해 푼 방법을 알게 되었고
다소 생소한 문법이 많아 이번에 분석해보기로 한다.
function solution(cacheSize, cities) {
const map = new Map();
const cacheHit = (city, map) => {
map.delete(city);
map.set(city, city);
return 1;
};
const cacheMiss = (city, map, size) => {
if(size === 0) return 5;
(map.size === size) && map.delete(map.keys().next().value);
map.set(city, city);
return 5;
};
const getTimeCache = (city, map, size) =>
(map.has(city) ? cacheHit : cacheMiss)(city, map, size);
return cities.map(city =>
getTimeCache(city.toLocaleLowerCase(), map, cacheSize)
).reduce( (a, c) => a + c, 0);
}
const map = new Map();
const cacheHit = (city, map) => {
map.delete(city);
map.set(city, city);
return 1;
};
map.delete(key)
– key에 해당하는 값을 삭제합니다.
map.set(key, value)
– key를 이용해 value를 저장합니다.
const cacheMiss = (city, map, size) => {
if(size === 0) return 5;
(map.size === size) && map.delete(map.keys().next().value);
map.set(city, city);
return 5;
};
Map.prototype.keys()
각 요소의 키를 모은 반복 가능한(iterable, 이터러블) 객체를 반환합니다.const map = new Map(); map1.set('0', 'foo'); map1.set(1, 'bar'); console.log(map.keys().next().value); // "0" console.log(map.keys().next().value); // 1
&&
- 단축평가 논리연산자
참고: https://curryyou.tistory.com/193(조건) && map.delete('값') // 조건이 false면 false // 조건이 true면 map에서 '값'을 삭제한다
const getTimeCache = (city, map, size) =>
(map.has(city) ? cacheHit : cacheMiss)(city, map, size);
함수 getTimeCache
에 대하여
이건 무슨 의미일까, 무슨 문법이지? 의문이었다.
곰곰히 다시 생각해보니 함수 cacheHit
과 cacheMiss
가 동일한 매개변수를 갖기 때문에 소괄호를 쳐서 코드를 줄인 것 같다. 사실 cacheHit
은 매개변수가 2개뿐이지만 3번째 매개변수를 넣어도 실행하진 않으니까 딱히 문제가 없는 것으로 보인다.
const 함수 = (매개변수1, 매개변수2, 매개변수3) =>
(조건 ? 함수1:함수2)(매개변수1a, 매개변수2, 매개변수3)
👉
const 함수 = (매개변수1, 매개변수2, 매개변수3) => {
if(조건){
return 함수1(매개변수1a, 매개변수2, 매개변수3)
}else{
return 함수2(매개변수1a, 매개변수2, 매개변수3)
}
}
getTimeCache
함수를 실행하고 반환된 값(1 or 5)를 매핑한다. 그리고 배열의 요소의 합을 반환한다.return cities.map(city =>
getTimeCache(city.toLocaleLowerCase(), map, cacheSize)
).reduce( (a, c) => a + c, 0);
toLocaleLowerCase()
메서드
지역 특정 대/소문자 맴핑에 따른 소문자로 변환된 문자열 값을 반환한다.