λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/Programmers

[Progammers] 그리디 μ•Œκ³ λ¦¬μ¦˜ - 체윑볡

 

 

문제 

 

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

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

 

 

μ œν•œ 사항 

 

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

 

ν•΄μ„€ μ½”λ“œ 
def solution(n, lost, reserve):

    set_reserve = set(reserve) - set(lost)
    set_lost = set(lost) - set(reserve)
    
    print(set_reserve)
    print(set_lost)
                
    for i in set_reserve:
        if i - 1 in set_lost:
            set_lost.remove(i - 1)
        elif i + 1 in set_lost:
            set_lost.remove(i + 1)
    return n - len(set_lost)
뢄석 > 이 문제의 경우 μ—¬λ²Œ μ²΄μœ‘λ³΅μ„ κ°€μ§€κ³  μ™”μœΌλ©΄μ„œ λ„λ‚œ λ‹Ήν•œ μ‚¬λžŒμ΄ μžˆμ„ μˆ˜λ„ 있기 λ•Œλ¬Έμ— 두 배열에 κ³΅ν†΅μ μœΌλ‘œ μ‘΄μž¬ν•˜λŠ” μ›μ†ŒλŠ” set을 μ΄μš©ν•˜μ—¬ μ œμ™Έν•΄ μ£Όκ³  μ‹œμž‘ν•œλ‹€. 그리고 μ²΄μœ‘λ³΅μ€ λ°”λ‘œ μ•žλ’€ μ‚¬λžŒμ—κ²Œλ§Œ λΉŒλ €μ€„ 수 μžˆλ‹€. λ§Œμ•½ μ—¬λ²Œ μ²΄μœ‘λ³΅μ„ κ°€μ§€κ³  온 μ‚¬λžŒμ΄ [3,5] 이고 λ„λ‚œ λ‹Ήν•œ μ‚¬λžŒμ΄ [2,4]인 경우 i + 1λΆ€ν„° νƒμƒ‰ν•œλ‹€λ©΄ 3은 4μ—κ²Œ μ˜·μ„ 쀄 수 μžˆμ§€λ§Œ 5λŠ” 2μ—κ²Œ μ˜·μ„ μ£Όμ§€ λͺ»ν•΄ λͺ¨λ‘κ°€ μ²΄μœ‘λ³΅μ„ μž…μ„ 수 μžˆμŒμ—λ„ ν•œ μ‚¬λžŒμ΄ μ˜·μ„ μž…μ§€ λͺ»ν•˜λŠ” κ²½μš°κ°€ λ°œμƒν•œλ‹€. λ”°λΌμ„œ μ—¬λ²Œ μ˜·μ„ κ°€μ§€κ³  온 μ‚¬λžŒλ³΄λ‹€ 1 μž‘μ€ 수λ₯Ό λ¨Όμ € 탐색해야 ν•œλ‹€. κ·Έλ ‡κ²Œ ν•΄μ„œ μ²΄μœ‘λ³΅μ„ 빌릴 수 μžˆλŠ” μ‚¬λžŒμ€ λ°°μ—΄μ—μ„œ μ œμ™Έν•˜μ—¬ μ΅œμ’…μ μœΌλ‘œ λˆ„κ΅¬μ—κ²Œλ„ μ²΄μœ‘λ³΅μ„ λΉŒλ¦¬μ§€ λͺ»ν•œ μ‚¬λžŒλ§Œ lost 배열에 남겨 전체 μΈμ›μˆ˜μ—μ„œ 이 μΈμ›μˆ˜λ₯Ό λΊ€ 값을 λ‹΅μœΌλ‘œ λ„μΆœν•œλ‹€.