ㅎ.ㅎ 작성하고 저장을 하루 뒤에 했네용 홧팅!~!
프로그래머스 할인행사 문제보기
내 풀이
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;
}
지금까진
맵은 키가 있는 데이터를 저장한다는 점에서 객체와 유사하다.
다만, 맵은 키에 다양한 자료형을 허용한다는 점에서 차이가 있습니다.
맵에는 다음과 같은 주요 메서드와 프로퍼티가 존재
- 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 등을 사용해야만 한다.
맵은 키로 객체를 허용한다.
: 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 사용
: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
매개변수,반환값 없음
: 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-set 와 mdn 참고
다음 세 가지 메서드를 사용해 맵의 각 요소에 반복 작업을 할 수 있다.
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
}
맵은 삽입 순서를 기억합니다.
맵은 값이 삽입된 순서대로 순회를 실시합니다. 객체가 프로퍼티 순서를 기억하지 못하는 것과는 다릅니다.
각 요소가 키-값 쌍인 배열이나 이터러블 객체를 초기화 용도로 맵에 전달해 새로운 맵을 만들 수 있습니다.
아래와 같이 말이죠.
// 각 요소가 [키,값] 쌍인 배열
let map = new Map([
['1', 'str1'],
[1, 'num1'],
[true, 'bool1']
]);
alert(map.get('1')):
평범한 객체를 가지고 맵을 만들고 싶다면 내장 메서드 Object.entries(obj)를 활용해야 합니다.
이 메서드는 객체의 키-값 쌍을 요소([key, value])로 가지는 배열을 반환합니다.