ํ ์คํธ ์ผ์ด์ค
want = ["banana", "apple", "rice", "pork", "pot"]
number = [3,2,2,2,1]
discount = ["chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana"]
XYZ ๋งํธ๋ ์ผ์ ๊ธ์ก์ ์ง๋ถํ๋ฉด 10์ผ๊ฐ ํ์ ์๊ฒฉ ๋ถ์ฌํ๋ค.
ํ์์ ๋์์ผ๋ก๋ ๋งค์ผ ํ๊ฐ์ง ์ ํ์ ํ ์ธํ๊ณ ํ ์ธ ์ ํ์ ํ๋ฃจ์ 1๊ฐ๋ง ๊ตฌ๋งค ๊ฐ๋ฅํ๋ค.
์ ํ์ด๋ ์ํ๋ ์ ํ๊ณผ ์๋์ด ํ ์ธํ๋ ๋ ์ง์ 10์ผ ์ฐ์์ผ๋ก ์ผ์นํ ๊ฒฝ์ฐ์ ๋ง์ถฐ ํ์๊ฐ์ ํ๊ธธ ์ํ๋ค.
๋ผ์ง๊ณ ๊ธฐ 5๊ฐ, ๋ฐ๋๋ 5๊ฐ๋ฅผ ์ํ ๊ฒฝ์ฐ ํ ์ธ ๋ฒ์์ ๋ผ์ง๊ณ ๊ธฐ 5๋ฒ, ๋ฐ๋๋ 5๋ฒ์ด ํฌํจ๋์ด์ผ ํ๋ค.
=> discount = ["pork", "pork", "pork", "pork", "pork", "banana", "banana", "banana", "banana", "banana"] ์ธ ๊ฒฝ์ฐ๊ฐ ์์ด์ผ ํ๋ค. (์์๋ ์๊ด์์)
์ ๊ทผ ๋ฐฉ๋ฒ
sliding window ๋ฐฉ์์ผ๋ก discount์ ๋ชจ๋ ๋ฒ์๋ฅผ ํ์ํ๊ณ O(N)
๊ฐ๋ฅํ ๊ฒฝ์ฐ answer += 1ํ๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ์๋ค.
๋ง์ฝ 11์ผ์ธ ๊ฒฝ์ฐ 0์ผ์ฐจ๋ฅผ ๋นผ๊ณ 11์ผ์ฐจ๋ฅผ ๋ํ๊ณ
12์ผ์ธ ๊ฒฝ์ฐ 1์ผ์ฐจ๋ฅผ ๋นผ๊ณ 12์ผ์ฐจ๋ฅผ ๋ํ๋ ๋ฐฉ์์ผ๋ก ์งํ
์ฐ์ ๋ฌผ๊ฑด์ ๋บ ๋ ์ง๋ฅผ ์ ์ฅํ๋ prev์ ๋ฌผ๊ฑด์ ๋ํ ๋ ์ง๋ฅผ ์ ์ฅํ๋ next ๋ณ์๋ฅผ ๋ง๋ค๊ณ ,
์ ํ์ด๊ฐ ์ํ๋ ๋ฌผ๊ฑด๊ณผ ๊ฐ์๋ฅผ key์ value๋ก ์ ์ฅํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ์๋ค.
let prev = 0; let next = 0; const shoppingObj = {}; want.forEach((e,idx) => shoppingObj[e] = number[idx]);โ
๊ฒฐ๊ณผ๋ก shoppingObj = {banana: 3, apple: 2, rice: 2, pork: 2, pot: 1}์ด ์์ฑ๋๊ณ
์ด shoppingObj์ ๋ชจ๋ value๊ฐ 0์ด ๋๋ฉด ๋ชจ๋ ์ ํ์ ํ ์ธ ๋ฐ๋ ๋ ์ด ๋๋ค.
์ด์ discount๋ฅผ ์ํํ๋ฉด์
1. ๋ค์๋ (next) shoppingObj[key] === discount ์ผ๋ -1;
2. ์ง๋๊ฐ ๋ (prev) shoppingObj[key] === discount ์ผ๋ +1;
3. shoppingObj[key] !== discount ์ผ๋ ์๋ฌด๊ฒ๋ ํ์ง ์๋๋ค.
๋ผ๋ ๋ก์ง์ ์งํํ๋ค.
์ฐ์ ์ฒซ 10์ผ๊ฐ์ discount ๊ฐ์ shoppingObj์ ๋ฐ์ํ๋ค.while(next < 10){ const item = discount[next]; if(!Object.keys(shoppingObj).includes(item)){ next++; }else{ shoppingObj[item] -= 1; next++; } }
๋ค์์ผ๋ก ์์ ์ดํ ๋ก์ง๋๋ก next๊ฐ discount์ ๋ง์ง๋ง ๋ ๊น์ง ์งํํ๋ค.while(next < discount.length){ let addItem = discount[next]; let delItem = discount[prev]; if(!Object.keys(shoppingObj).includes(addItem)){ next++; }else{ shoppingObj[addItem] -= 1; next++; } if(!Object.keys(shoppingObj).includes(delItem)){ prev++; }else{ shoppingObj[delItem] += 1; prev++; } if(allItemSale(shoppingObj)) answer += 1; }
allItemSale์ object๋ฅผ ๋ฐ์์ object์ ๋ชจ๋ ๊ฐ์ด 0์ด๋ฉด true๋ฅผ ๋ฐํํ์ฌ ๋ชจ๋ ๊ฐ์ด 0์ธ์ง ์ฒดํฌํ๋ค.if(allItemSale(shoppingObj)) answer += 1; const allItemSale = (obj) => { let result = Object.values(obj).filter(e => e !== 0); return result.length === 0 ? true : false; }
๊ณ ์น ์
1. ๊ตณ์ด discount 10๊น์ง ๋ฐ๋ก ์ฒ๋ฆฌํด์ผ ํ ๊น?while(next < 10){ const item = discount[next]; if(!Object.keys(shoppingObj).includes(item)){ next++; }else{ shoppingObj[item] -= 1; next++; } }
2. ์ด๋ฐ ํ์์ ์ฝ๋๊ฐ 3๋ฒ์ด๋ ๋ฑ์ฅํ๋ค.if(!Object.keys(shoppingObj).includes(addItem)){ next++; }else{ shoppingObj[addItem] -= 1; next++; }
์ฝ๋ ์์ if(next - prev < 10){ next = setAddItem(shoppingObj, addItem, next); }else{ next = setAddItem(shoppingObj, addItem, next); prev = setDelItem(shoppingObj, delItem, prev); } const setAddItem = (shoppingObj, item, index) => { if(Object.keys(shoppingObj).includes(item)){ shoppingObj[item] -= 1; } index += 1; return index; } const setDelItem = (shoppingObj, item, index) => { if(Object.keys(shoppingObj).includes(item)){ shoppingObj[item] += 1; } index += 1; return index; }
1. if(next > prev)์ผ๋๋ฅผ ๋ณธ ๋ก์ง์ ์ถ๊ฐํ์ฌ ํด๊ฒฐ2. ํจ์๋ฅผ ๋ง๋ค์ด ์ ๋ฆฌ
ํ๋์ setItem์ผ๋ก ๋ง๋ค๊ณ ์ถ์๋๋ฐ
shoppingObj[item] -= 1;
shoppingObj[item] += 1;
๋ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ค์ ๋๊ฐ์ง ํจ์๋ก ์์ฑํ์๋ค.
function solution(want, number, discount) {
var answer = 0;
let prev = 0;
let next = 0;
const shoppingObj = {};
want.forEach((e,idx) => shoppingObj[e] = number[idx]);
while(next - prev < 10){
const item = discount[next];
if(!Object.keys(shoppingObj).includes(item)){
next++;
}else{
shoppingObj[item] -= 1;
next++;
}
}
if(allItemSale(shoppingObj)) answer += 1;
while(next < discount.length){
let addItem = discount[next];
let delItem = discount[prev];
if(!Object.keys(shoppingObj).includes(addItem)){
next++;
}else{
shoppingObj[addItem] -= 1;
next++;
}
if(!Object.keys(shoppingObj).includes(delItem)){
prev++;
}else{
shoppingObj[delItem] += 1;
prev++;
}
if(allItemSale(shoppingObj)) answer += 1;
}
return answer;
}
const allItemSale = (obj) => {
let result = Object.values(obj).filter(e => e !== 0);
return result.length === 0 ? true : false;
}
// ๋ฆฌํฉํ ๋ง ์ฝ๋
function solution(want, number, discount) {
var answer = 0;
let prev = 0;
let next = 0;
const shoppingObj = {};
want.forEach((e,idx) => shoppingObj[e] = number[idx]);
while(next < discount.length){
let addItem = discount[next];
let delItem = discount[prev];
if(next - prev < 10){
next = setAddItem(shoppingObj, addItem, next);
}else{
next = setAddItem(shoppingObj, addItem, next);
prev = setDelItem(shoppingObj, delItem, prev);
}
if(isAllItemSale(shoppingObj)) answer += 1;
}
return answer;
}
const setAddItem = (shoppingObj, item, index) => {
if(Object.keys(shoppingObj).includes(item)){
shoppingObj[item] -= 1;
}
index += 1;
return index;
}
const setDelItem = (shoppingObj, item, index) => {
if(Object.keys(shoppingObj).includes(item)){
shoppingObj[item] += 1;
}
index += 1;
return index;
}
const isAllItemSale = (obj) => {
let result = Object.values(obj).filter(e => e !== 0);
return result.length === 0 ? true : false;
}
'์ฝ๋ฉํ ์คํธ > ํ๋ก๊ทธ๋๋จธ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Javascript] ์ค์ ๋๋น ๋ชจ์๊ณ ์ฌ 2์ฐจ 1๋ฒ (0) | 2022.07.27 |
---|---|
[Javascript] ์ค์ ๋๋น ๋ชจ์๊ณ ์ฌ 1์ฐจ 3๋ฒ (0) | 2022.07.13 |
[Javascript] ์ค์ ๋๋น ๋ชจ์๊ณ ์ฌ 1์ฐจ 1๋ฒ (0) | 2022.07.13 |
[Javascript] ์ต์๊ฐ ๋ง๋ค๊ธฐ (12941) (0) | 2022.06.25 |
[Javascript] ์ค ์๋ ๋ฐฉ๋ฒ (12936) (0) | 2022.06.25 |