Lv.2 - [1차]캐시 - Map() 방법 분석

송철진·2023년 3월 17일
0

개요

프로그래머스의 다른 유저가 Map()을 이용해 푼 방법을 알게 되었고
다소 생소한 문법이 많아 이번에 분석해보기로 한다.

Solution

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);
}

풀이 분석

맵과 셋
https://ko.javascript.info/map-set

  1. 변수 map에 키의 자료형이 자유로운 Map()을 할당하여 선언한다.
	const map = new Map();
  1. 캐시에 데이터가 있을 경우 삭제하고 다시 저장한다. 실행시간 1초 소요.
	const cacheHit = (city, map) => {
        map.delete(city);
        map.set(city, city);
        return 1;
    };

map.delete(key) – key에 해당하는 값을 삭제합니다.
map.set(key, value) – key를 이용해 value를 저장합니다.

  1. 캐시 size가 0이면 실행시간 5초 소요.
    캐시 size가 0이 아니고, 캐시가 꽉 찼으면 map에서 가장 앞순서의 키를 삭제한다.
    캐시에 데이터를 신규 저장한다. 실행시간 5초 소요.
	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에서 '값'을 삭제한다
  1. map에 city가 존재한다면 cacheHit()을 실행하고 없다면 cacheMiss()를 실행한다.
const getTimeCache = (city, map, size) => 
    	(map.has(city) ? cacheHit : cacheMiss)(city, map, size);

함수 getTimeCache에 대하여
이건 무슨 의미일까, 무슨 문법이지? 의문이었다.
곰곰히 다시 생각해보니 함수 cacheHitcacheMiss가 동일한 매개변수를 갖기 때문에 소괄호를 쳐서 코드를 줄인 것 같다. 사실 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)
    }
}
  1. 입력받은 배열 cities의 요소 city에 대해 대소문자 상관없이 순회하여 getTimeCache함수를 실행하고 반환된 값(1 or 5)를 매핑한다. 그리고 배열의 요소의 합을 반환한다.
return cities.map(city => 
          getTimeCache(city.toLocaleLowerCase(), map, cacheSize)
                 ).reduce( (a, c) => a + c, 0);

toLocaleLowerCase() 메서드
지역 특정 대/소문자 맴핑에 따른 소문자로 변환된 문자열 값을 반환한다.

profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글