πŸ˜Ίν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - LV.2 할인 행사 [JS]

laonΒ·2024λ…„ 6μ›” 23일
post-thumbnail

문제 μ„€λͺ…

λ§ˆνŠΈμ—μ„œ ν•˜λ£¨μ— ν•œ κ°€μ§€ ν’ˆλͺ©μ”© 할인을 ν•œλ‹€. μ •ν˜„μ΄λŠ” μ›ν•˜λŠ” μ œν’ˆμ΄ 있으며, λ§Œμ•½ 연속 10일 λ™μ•ˆ ν• μΈν•˜λŠ” μ œν’ˆμ΄ μ •ν˜„μ΄κ°€ μ›ν•˜λŠ” μ œν’ˆκ³Ό μΌμΉ˜ν•˜λ©΄ νšŒμ› 등둝을 ν•˜λ €κ³  ν•œλ‹€. μ •ν˜„μ΄κ°€ μ›ν•˜λŠ” λͺ¨λ“  μ œν’ˆμ„ 할인 받을 수 μžˆλŠ” νšŒμ› 등둝 λ‚ μ§œμ˜ 총 일수λ₯Ό return. κ°€λŠ₯ν•œ 날이 μ—†μœΌλ©΄ 0 return.

풀이

이 λ¬Έμ œμ—μ„œλŠ” Map 자료ꡬ쑰λ₯Ό μ‚¬μš©ν–ˆλ‹€. Map을 μ‚¬μš©ν•˜μ—¬ μ›ν•˜λŠ” μ œν’ˆκ³Ό μˆ˜λŸ‰μ„ μ €μž₯ν•˜κ³ , 할인 λͺ©λ‘κ³Ό λΉ„κ΅ν•˜μ—¬ μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•˜λ©΄ λœλ‹€.

  1. μ›ν•˜λŠ” μ œν’ˆκ³Ό κ·Έ μˆ˜λŸ‰μ„ Map에 μ €μž₯ν•œλ‹€.
  2. 각 10일 κ°„κ²©μ˜ 할인 λͺ©λ‘μ—μ„œ μ›ν•˜λŠ” μ œν’ˆκ³Ό μˆ˜λŸ‰μ΄ μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
  3. μΌμΉ˜ν•˜λŠ” 경우 νšŒμ› 등둝이 κ°€λŠ₯ν•œ λ‚  수λ₯Ό μ¦κ°€μ‹œν‚¨λ‹€.
  4. 총 일수λ₯Ό λ°˜ν™˜ν•œλ‹€.

첫 풀이(μ‹€νŒ¨)

μ²˜μŒμ—λŠ” λͺ‡ 번째 날에 νšŒμ› 등둝을 ν• μ§€ λ°˜ν™˜ν•˜λŠ” κ²ƒμœΌλ‘œ μ°©κ°ν•΄μ„œ, 쑰건을 λ§Œμ‘±ν•˜λŠ” 날이 μžˆμ„ λ•Œλ§ˆλ‹€ i+1을 λ°˜ν™˜ν–ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ¬Έμ œλŠ” 총 λͺ‡ 일 λ™μ•ˆ νšŒμ› 등둝이 κ°€λŠ₯ν•œμ§€λ₯Ό 묻고 μžˆμ—ˆλ‹€...γ…œγ…œ

function solution(want, number, discount) {
    var answer = 0;
    let totalItemsCount = 0;
    const wantItemMap = new Map();
    for(let i = 0;i < want.length;i++){
        wantItemMap.set(want[i], number[i]);
        totalItemsCount += number[i];
    }
    for(let i = 0;i <= discount.length-totalItemsCount;i++){
        const discountItemMap = new Map(wantItemMap);
        for(let j = i;j < i+totalItemsCount;j++){
            if(discountItemMap.has(discount[j])){
                discountItemMap.set(discount[j], discountItemMap.get(discount[j])-1);
                if(discountItemMap.get(discount[j]) === 0){
                    discountItemMap.delete(discount[j]);
                }
            } else {
                break;
            }
        }
        if(discountItemMap.size === 0 ){
            return i+1;
        }
    }
    return answer;
}

두 번째 풀이(성곡)

function solution(want, number, discount) {
    var answer = 0;
    let totalItemsCount = 0;
    const wantItemMap = new Map();
    for(let i = 0;i < want.length;i++){
        wantItemMap.set(want[i], number[i]);
        totalItemsCount += number[i];
    }
    for(let i = 0;i <= discount.length-totalItemsCount;i++){
        const discountItemMap = new Map(wantItemMap);
        for(let j = i;j < i+totalItemsCount;j++){
            if(discountItemMap.has(discount[j])){
                discountItemMap.set(discount[j], discountItemMap.get(discount[j])-1);
                if(discountItemMap.get(discount[j]) === 0){
                    discountItemMap.delete(discount[j]);
                }
            } else {
                break;
            }
        }
        if(discountItemMap.size === 0 ){
            answer++;
        }
    }
    return answer;
}

λ¦¬νŒ©ν† λ§

function solution(want, number, discount) {
    var answer = 0;
    const wantItemMap = new Map();
    
    if(discount.length < 10) return 0;
    
    for(let i = 0;i < want.length;i++){
        wantItemMap.set(want[i], number[i]);
    }
    
    for(let i = 0;i <= discount.length-10;i++){
        let isValid = true;
        const discountItemMap = new Map();
        for(let j = i;j < i+10;j++){
            discountItemMap.set(discount[j], (discountItemMap.get(discount[j]) || 0) + 1);
        }
        for(const [key, value] of wantItemMap){
            if(discountItemMap.get(key) !== value){
                isValid = false;
                break;
            }
        }
        if(isValid) {
            answer++;
        };
    }
    return answer;
}

λŠλ‚€μ πŸ˜Ί

문제λ₯Ό μ œλŒ€λ‘œ μ•ˆ 읽고 ν’€μ–΄μ„œ ν•˜λ£¨ 쒅일 κ³ μƒν–ˆλ‹€. κ²°κ΅­ 총 λ‚ μ§œ 수λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€λŠ” 것을 깨달은 건 μƒˆλ²½ 12μ‹œ 30λΆ„μ΄μ—ˆλ‹€. λ¬Έμ œκ°€ ν‹€λ¦° 점을 λͺ°λΌμ„œ κ³„μ†ν•΄μ„œ μ‹œλ„ν–ˆμ§€λ§Œ λ§‰ν˜”λ‹€. 정말 μžμ‹ κ°μ΄ λ–¨μ–΄μ§€λŠ” μˆœκ°„μ΄μ—ˆλ‹€. λ‹€μŒλΆ€ν„°λŠ” 문제λ₯Ό λ˜‘λ°”λ‘œ 읽고 μ΄ν•΄ν•˜λŠ” 데 더 μ‹ κ²½ 써야겠닀...γ…œγ…œ

profile
laonlaon

0개의 λŒ“κΈ€