πŸ“• Algorithm/Solved

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 체윑볡 (Javascript)

ν•œμ½”λ”© 2021. 1. 10. 21:41
728x90
728x90

문제 μ„€λͺ…

μ μ‹¬μ‹œκ°„μ— 도둑이 λ“€μ–΄, 일뢀 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμŠ΅λ‹ˆλ‹€. λ‹€ν–‰νžˆ μ—¬λ²Œ 체윑볡이 μžˆλŠ” 학생이 μ΄λ“€μ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주렀 ν•©λ‹ˆλ‹€. ν•™μƒλ“€μ˜ λ²ˆν˜ΈλŠ” 체격 순으둜 맀겨져 μžˆμ–΄, λ°”λ‘œ μ•žλ²ˆν˜Έμ˜ ν•™μƒμ΄λ‚˜ λ°”λ‘œ λ’·λ²ˆν˜Έμ˜ ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 4번 학생은 3번 ν•™μƒμ΄λ‚˜ 5번 ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€. 체윑볡이 μ—†μœΌλ©΄ μˆ˜μ—…μ„ 듀을 수 μ—†κΈ° λ•Œλ¬Έμ— μ²΄μœ‘λ³΅μ„ 적절히 빌렀 μ΅œλŒ€ν•œ λ§Žμ€ 학생이 μ²΄μœ‘μˆ˜μ—…μ„ λ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.

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

 

μ œν•œμ‚¬ν•­

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

μž…μΆœλ ₯ 예

5 [2, 4] [1, 3, 5] 5
5 [2, 4] [3] 4
3 [3] [1] 2

 

μž…μΆœλ ₯ 예 μ„€λͺ…

예제 #1
1번 학생이 2번 ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주고, 3번 ν•™μƒμ΄λ‚˜ 5번 학생이 4번 ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주면 학생 5λͺ…이 μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

예제 #2
3번 학생이 2번 ν•™μƒμ΄λ‚˜ 4번 ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주면 학생 4λͺ…이 μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

function solution(n, lost, reserve) {
    var answer = 0;
    
    // lost와 reserve λ‘˜λ‹€ μžˆλŠ” 번호λ₯Ό 제거
    let realLost = lost.filter(x => !reserve.includes(x));
    let realReserve = reserve.filter(x => !lost.includes(x));
   
    // λ°°μ—΄ lost의 ν•™μƒλ“€μ—κ²Œ reserve λ°°μ—΄μ˜ 학생듀이 빌렀주면 λ°°μ—΄ lost길이가 쀄어든닀.
    // 총 nλͺ…μ—μ„œ reserve ν•™μƒλ“€μ—κ²Œ λΉŒλ¦¬μ§€ λͺ»ν•œ 학생 수λ₯Ό λΉΌλ©΄ μ΅œλŒ€κ°’
    answer = n - realLost.filter(a => {
        // μ—¬λ²Œμ΄ μžˆλŠ” ν•™μƒμ˜ λ²ˆν˜Έκ°€ μ—†λŠ” ν•™μƒμ˜ 번호의 차이가 1 μ΄ν•˜μΈ 학생을 μ°ΎλŠ”λ‹€.
        let b = realReserve.find(r => Math.abs(r-a) <= 1);
        
        // λ§Œμ•½ μ—†μœΌλ©΄ trueλ₯Ό λ°˜ν™˜ν•˜μ—¬ μ’…λ£Œ
        if(!b) 
            return true;
        
        // 찾은 ν•™μƒμ˜ 번호λ₯Ό μ§€μš΄λ‹€.
        realReserve = realReserve.filter(r => r !== b);
    }).length;
   
    return answer;
}

 

μ•„λž˜μ™€ 같이 lost와 reserve에 λ™μ‹œμ— λ“€μ–΄κ°„ 수λ₯Ό μ œκ±°ν•΄μ€€λ‹€. μ™œλƒν•˜λ©΄, μ—¬λ²Œμ΄ μžˆλŠ” 학생이 λ„λ‚œλ‹Ήν•œ 경우, ν•˜λ‚˜μ˜ 체윑볡만 가진 학생듀과 같은 취급을 λ°›κΈ° λ•Œλ¬Έμ— μ œκ±°ν•΄μ€€λ‹€.

    // lost와 reserve λ‘˜λ‹€ μžˆλŠ” 번호λ₯Ό 제거
    let realLost = lost.filter(x => !reserve.includes(x));
    let realReserve = reserve.filter(x => !lost.includes(x));

 

realLost의 ν•™μƒμ˜ λ²ˆν˜Έκ°€ realReserve의 ν•™μƒμ˜ λ²ˆν˜Έμ™€μ˜ μ°¨κ°€ 1μ΄ν•˜μΈ 경우λ₯Ό μ°ΎλŠ”λ‹€.

μ™œλƒν•˜λ©΄, realReserve의 학생이 λ°”λ‘œ μ˜†μ—μžˆλŠ” realLost ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 있기 λ•Œλ¬Έμ΄λ‹€.

λ§Œμ•½ 찾지 λͺ»ν•œλ‹€λ©΄, λΉŒλ €μ€„ 수 μ—†κΈ° λ•Œλ¬Έμ— trueλ₯Ό λ°˜ν™˜ν•˜μ—¬ λ‹€μŒ realLost ν•™μƒμ˜ 번호λ₯Ό νƒμƒ‰ν•˜κ³  μœ„μ™€ 같이 λ°˜λ³΅ν•œλ‹€.

realLost 학생듀을 λͺ¨λ‘ ν•„ν„°λ§ν•œ ν›„μ˜ realLost의 κΈΈμ΄λŠ” κ²°κ΅­ 체윑볡 받지 λͺ»ν•œ ν•™μƒλ“€λ§Œ λ‚¨μ•„μžˆλ‹€.

λ”°λΌμ„œ, 총 nλͺ…μ—μ„œ realLost의 길이λ₯Ό λΉΌλ©΄ 체윑 μˆ˜μ—…μ„ 듀을 수 μžˆλŠ” μ΅œλŒ€ ν•™μƒμ˜ 수λ₯Ό ꡬ할 수 μžˆλ‹€.

    answer = n - realLost.filter(a => {
        // μ—¬λ²Œμ΄ μžˆλŠ” ν•™μƒμ˜ λ²ˆν˜Έκ°€ μ—†λŠ” ν•™μƒμ˜ 번호의 차이가 1 μ΄ν•˜μΈ 학생을 μ°ΎλŠ”λ‹€.
        let b = realReserve.find(r => Math.abs(r-a) <= 1);
        
        // λ§Œμ•½ μ—†μœΌλ©΄ trueλ₯Ό λ°˜ν™˜ν•˜μ—¬ μ’…λ£Œ
        if(!b) 
            return true;
        
        // 찾은 ν•™μƒμ˜ 번호λ₯Ό μ§€μš΄λ‹€.
        realReserve = realReserve.filter(r => r !== b);
    }).length;

 

728x90
λ°˜μ‘ν˜•