[Lv1] νƒμš•λ²•(Greedy) > 체윑볡

2022. 8. 16. 23:32γ†κ°œλ°œ/μ½”λ”©ν…ŒμŠ€νŠΈ

νƒμš•λ²•(Greedy) > 체윑볡

μ μ‹¬μ‹œκ°„μ— 도둑이 λ“€μ–΄, 일뢀 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμŠ΅λ‹ˆλ‹€. λ‹€ν–‰νžˆ μ—¬λ²Œ 체윑볡이 μžˆλŠ” 학생이 μ΄λ“€μ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주렀 ν•©λ‹ˆλ‹€. ν•™μƒλ“€μ˜ λ²ˆν˜ΈλŠ” 체격 순으둜 맀겨져 μžˆμ–΄, λ°”λ‘œ μ•žλ²ˆν˜Έμ˜ ν•™μƒμ΄λ‚˜ λ°”λ‘œ λ’·λ²ˆν˜Έμ˜ ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€. 

전체 ν•™μƒμ˜ 수 n, μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ ν•™μƒλ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ lost, μ—¬λ²Œμ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ ν•™μƒλ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ reserveκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆλŠ” ν•™μƒμ˜ μ΅œλŒ“κ°’μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œμ‚¬ν•­
- 전체 ν•™μƒμ˜ μˆ˜λŠ” 2λͺ… 이상 30λͺ… μ΄ν•˜μž…λ‹ˆλ‹€.
- μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ ν•™μƒμ˜ μˆ˜λŠ” 1λͺ… 이상 nλͺ… μ΄ν•˜μ΄κ³  μ€‘λ³΅λ˜λŠ” λ²ˆν˜ΈλŠ” μ—†μŠ΅λ‹ˆλ‹€.
- μ—¬λ²Œμ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ ν•™μƒμ˜ μˆ˜λŠ” 1λͺ… 이상 nλͺ… μ΄ν•˜μ΄κ³  μ€‘λ³΅λ˜λŠ” λ²ˆν˜ΈλŠ” μ—†μŠ΅λ‹ˆλ‹€.
- μ—¬λ²Œ 체윑볡이 μžˆλŠ” ν•™μƒλ§Œ λ‹€λ₯Έ ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.
- μ—¬λ²Œ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ 이 학생은 μ²΄μœ‘λ³΅μ„ ν•˜λ‚˜λ§Œ λ„λ‚œλ‹Ήν–ˆλ‹€κ³  κ°€μ •ν•˜λ©°, 남은 체윑볡이 ν•˜λ‚˜μ΄κΈ°μ— λ‹€λ₯Έ ν•™μƒμ—κ²ŒλŠ” μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μ—†μŠ΅λ‹ˆλ‹€.

 

λ‚΄ λ‹΅λ³€

function solution(n, lost, reserve) {
    const reserveSet = new Set(reserve);
    lost.sort();
    reserve.sort();

    // μ—¬λ²Œ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ 경우 제거
    let answer = lost.filter((v) => {
        if(reserveSet.has(v)){
            reserveSet.delete(v);    
            return false;
        }
        return true;
    })

    answer = answer.filter((v) => {
        if(reserveSet.has(v-1)){
            reserveSet.delete(v-1)
            return false
        } else if (reserveSet.has(v+1)){
            reserveSet.delete(v+1)
            return false
        }
        return true
    }).length;

    return n - answer
}

- 이번 λ¬Έμ œλŠ” ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€κ°€ 계속 μΆ”κ°€λ˜λ©΄μ„œ κ΅¬ν˜„ν•˜κΈ°κ°€ 점점 κΉŒλ‹€λ‘œμ›Œμ‘Œλ‹€κ³  λŒ“κΈ€μ΄ 달린 λ¬Έμ œμ˜€λ‹€. 일단 λ‚˜λŠ” μ‹œκ°„λ³΅μž‘λ„λ₯Ό O(n)으둜 κ°€μ Έκ°€κΈ° μœ„ν•΄μ„œ 'μ—¬λ²Œμ˜ μ²΄μœ‘λ³΅μ„ κ°€μ§€κ³  μ™”μ§€λ§Œ μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ 경우'λ₯Ό μ œκ±°ν•˜λŠ” λ‘œμ§μ„ λ¨Όμ € μ‹œν–‰ν–ˆλ‹€.

- κ·Έ ν›„μ—λŠ” if-else문으둜 λ°”λ‘œ μ•ž/λ’€μ˜ ν•™μƒμ—κ²Œ λΉŒλ¦¬λŠ” 경우, reserveSet(μ—¬λ²Œμ˜μ²΄μœ‘λ³΅ μ…‹)μ—μ„œ ν•΄λ‹Ή 체윑볡 데이터λ₯Ό μ‚­μ œν•˜κ³  falseλ₯Ό λ¦¬ν„΄ν•˜μ—¬ ν•„ν„°λ§ν•΄μ£Όμ—ˆλ‹€.

- 이 κ³Όμ •μ—μ„œ μ—¬λ²Œμ˜ μ²΄μœ‘λ³΅μ„ λΉŒλ¦¬μ§€ λͺ»ν•œ ν•™μƒλ“€λ§Œμ΄ answer에 λ‹΄κΈ°κ³ , μ „μ²΄ν•™μƒμ˜ 수 nμ—μ„œ answer의 lengthλ₯Ό λΉΌμ£Όμ—ˆλ‹€.

 

 

λ‹€λ₯Έ λΆ„λ“€ λ‹΅λ³€

function solution(n, lost, reserve) {      
    return n - lost.filter(a => {
        const b = reserve.find(r => Math.abs(r-a) <= 1)
        if(!b) return true
        reserve = reserve.filter(r => r !== b)
    }).length
}

=> μ‹œκ°„λ³΅μž‘λ„κ°€ O(n^2)으둜 μ„±λŠ₯μƒμœΌλ‘œλŠ” 쑰금 손해λ₯Ό λ³΄μ§€λ§Œ μ½”λ“œκ°€ ꡉμž₯히 μ§§μ•˜λ‹€. 특히 findλ₯Ό μ‚¬μš©ν•΄μ„œ μ ˆλŒ€κ°’ λΉ„κ΅λ‘œ ν•„ν„°λ§ν•˜λŠ” 방법을 보고 와 μ§„μ§œ λ˜‘λ˜‘ν•˜μ‹œκ΅¬λ‚˜ ν•˜κ³  κ°νƒ„ν–ˆλ‹€!

 

ν•˜μ§€λ§Œ μ§€κΈˆμ€ μœ„μ˜ 사진과 같이 ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€κ°€ μΆ”κ°€λ˜λ©΄μ„œ 'μ—¬λ²Œμ„ μ±™κ²ΌμœΌλ‚˜ λ„λ‚œλ‹Ήν•œ 학생'에 λŒ€ν•œ μ²˜λ¦¬κ°€ λ˜μ§€ μ•Šμ€ μ½”λ“œλŠ” λͺ‡λͺ‡ ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ—μ„œ μ‹€νŒ¨μ²˜λ¦¬κ°€ λœλ‹€. λ”°λΌμ„œ 이 μ½”λ“œκ°€ ν˜„μž¬μ˜ κΈ°μ€€μœΌλ‘œλ„ 톡과될 수 μžˆλ„λ‘ λ°”κΎΌλ‹€λ©΄ μ΄λ ‡κ²Œ 될 것 같은데..

function solution(n, lost, reserve) {
    lost.sort();
    reserve.sort();
    
    lost = lost.filter(a => {
        const b = reserve.find(r => r==a);
        if(!b) return true
        reserve = reserve.filter(r => r!==b);
    })
    
    return n - lost.filter(a => {
        const b = reserve.find(r => Math.abs(r-a) <= 1)
        if(!b) return true
        reserve = reserve.filter(r => r !== b)
    }).length
}

μ½”λ“œ μ€„μ΄λŠ”κ±Έ ꡉμž₯히 μž˜ν•˜μ‹œλŠ” 뢄듀은 더 짧게 쀄이싀 μˆ˜λ„ μžˆμ„ 것 같은데, λ‚˜λŠ” μš°μ„ μ€ μ΄λ ‡κ²Œ ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€λ₯Ό λͺ¨λ‘ λ‹€ ν†΅κ³Όν•˜λŠ”κ±Έλ‘œ λ°”κΏ”λ³Έ 걸둜 λ§Œμ‘±ν•˜κ³  μ‹€λ ₯을 μŒ“μ•„μ•Όκ² λ‹€..^^