D+5 할인행사 js , Map get, clear, entries (주말에 보충예정)

초록귤·2024년 11월 29일
0

100일프로젝트

목록 보기
5/16
post-thumbnail

ㅎ.ㅎ 작성하고 저장을 하루 뒤에 했네용 홧팅!~!

프로그래머스 할인행사 문제보기

내 풀이

function solution(want, number, discount) {
    const arr = {};
    const wantLength = want.length;

    // want와 number를 객체로 만들어줌
    for (let i = 0; i < wantLength; i++) {
        arr[want[i]] = number[i];
    }

    let result = 0;

    // 할인 목록을 10일씩 슬라이스하여 확인
    for (let i = 0; i <= discount.length - 10; i++) {
        const sliceArr = discount.slice(i, i + 10);
        const tempArr = { ...arr }; // 초기 상태 복사
        // 10일 동안 할인 제품 확인
        for (let j = 0; j < sliceArr.length; j++) {
            // 할인 제품이 정현이가 원하는 제품인지 확인
            if (tempArr[sliceArr[j]] !== undefined) {
                tempArr[sliceArr[j]] -= 1; // 원하는 제품의 수량 감소
            }
        }

        // 모든 제품이 0 이하인지 확인
        if (Object.values(tempArr).every(value => value <= 0)) {
            result += 1; // 조건에 맞는 경우 카운트
        }
    }

    return result;
}

지금까진

  • 객체 : 키가 있는 컬렉션 저장
  • 배열 : 순서가 있는 컬렉션 저장
    하지만 현실 세계를 반영하기엔 이 두 자료구조만으로 부족해서 Map과 Set이 등장하게 되었다.

Map 인스턴스 메서드 정리

맵은 키가 있는 데이터를 저장한다는 점에서 객체와 유사하다.
다만, 맵은 키에 다양한 자료형을 허용한다는 점에서 차이가 있습니다.
맵에는 다음과 같은 주요 메서드와 프로퍼티가 존재

  • new Map() : 맵을 만든다
  • map.set(key, value) : key를 이용해 value를 저장
  • map.get(key) : key에 해당하는 값을 반환. key가 존재하지 않으면 undefined 반환
  • map.has(key) : key가 존재하면 true, 존재하지 않으면 false 반환
  • map.delete(key) : key에 해당하는 값 삭제
  • map.clear() : 맵 안의 모든 요소 제거
  • map.size : 요소의 개수 반환

주의사항

(!) map[key]는 Map을 올바르게 쓰는 방법이 아니다.
맵은 객체와 달리 키를 문자형으로 변환하지 않는다.
키엔 자료형 제약이 없다.
map[key] =2로 값을 설정하는 것 같이 map[key]를 사용할 수 있긴 하다.
하지만 이 방법은 map을 일반 객체처럼 취급하게 된다.
따라서 여러 제약이 생기므로 map을 사용할 땐 map 전용 메서드 set, get 등을 사용해야만 한다.

맵은 키로 객체를 허용한다.

1. Map.prototype.get()

: get() 메서드는 Map 객체에서 특정 요소를 반환
만약 주어진 키와 관련된 값이 객체라면 해당 객체에 대한 참조만 가져오고,
해당 객체에 대한 모든 변경은 Map 내에서 효율적으로 수정된다.

const map1 = new Map();
map1.set('bar', 'foo');

console.log(map1.get('bar') // Expected output : 'foo'
console.log(map1.get('baz') // Expected output : undefined

매개변수
key : Map 객체에서 반환받을 요소의 키
반환 값
명시된 키와 연관된 요소 혹은 Map 객체에서 해당 키를 찾을 수 없는 경우 undefined

맵이 원본 객체에 대한 참조만 보유하고 있다는 것은 해당 객체가 가비지 콜렉션되지 않을 수 있으며 이로 인해 예측하지 못한 메모리 문제가 일어날 수 있음을 의미.
만약 맵에 저장되어 있는 객체가 원본 객체와 동일한 수명을 가지게 하려면 WeakMap 사용

2. Map.prototype.clear()

:Map의 clear() 메서드는 해당 Map의 모든 요소를 제거한다.

const map1 = new Map();
map1.set('bar','baz');
map1.set(1,'foo');
console.log(map1.size); //Expected output : 2
console.log(...map1,'map1); // Array["bar","baz"] Array["1,"foo"] "map1"
map1.clear(); 
console.log(map1.size); //Expected output : 0 

매개변수,반환값 없음

3. Map.prototype.entries()

: Map 객체의 entries() 메서드는 이 Map의 각 요소의 [key, value] 쌍을 삽입 순서대로 가지는 새로운 맵 반복자 객체를 반환합니다.

const map1 = new Map();
map1.set('0', 'foo');
map1.set(1, 'bar');

const iterator1 = map1.entries();
console.log(...iterator1,'iterator1') 
// output : Array ["0", "foo"] Array [1, "bar"] "iterator1"
console.log(iterator1.next().value); //Expected output: Array ["0", "foo"]
console.log(iterator1.next().value); //Expected output Array [1,"bar"]

https://ko.javascript.info/map-setmdn 참고

맵의 요소에 반복 작업하기

다음 세 가지 메서드를 사용해 맵의 각 요소에 반복 작업을 할 수 있다.

  • map.keys() : 각 요소의 키를 모은 반복 가능한(iterable, 이터러블) 객체를 반환합니다.
  • map.values() : 각 요소의 값을 모은 이터러블 객체를 반환합니다.
  • map.entries() : 요소의 [키,값]을 한 쌍으로 하는 이터러블 객체를 반환합니다.
    이 이터러블 객체는 for..of 반복문의 기초로 쓰입니다.
let recipeMap = new Map([['cucumber', 500], ['tomatoes', 350], ['onion', 50]]);

// 키(vegetable)를 대상으로 순회합니다. 
for (let vegetable of recipeMap.keys()) {
  alert(vegetable);
}

// 값(amount)를 대상으로 순회합니다. 
for (let amount of recipeMap.values()) {
  alert(amount); // 500, 350, 50
}

// [키, 값] 쌍을 대상으로 순회합니다. 
for (let entry of recipeMap) { // recipeMap.entries()와 동일합니다.
  alert(entry); // cucumber, 500
}

맵은 삽입 순서를 기억합니다.
맵은 값이 삽입된 순서대로 순회를 실시합니다. 객체가 프로퍼티 순서를 기억하지 못하는 것과는 다릅니다.

Object.entries : 객체를 맵으로 바꾸기

각 요소가 키-값 쌍인 배열이나 이터러블 객체를 초기화 용도로 맵에 전달해 새로운 맵을 만들 수 있습니다.
아래와 같이 말이죠.

// 각 요소가 [키,값] 쌍인 배열
let map = new Map([ 
  ['1', 'str1'],
  [1,  'num1'],
  [true, 'bool1']
]);

alert(map.get('1')):

평범한 객체를 가지고 맵을 만들고 싶다면 내장 메서드 Object.entries(obj)를 활용해야 합니다.
이 메서드는 객체의 키-값 쌍을 요소([key, value])로 가지는 배열을 반환합니다.

profile
초록색 귤이 노랑색으로 익어가듯, 실력이 익어가기 위해 노력하는 개발자 lahee입니다.

0개의 댓글