[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/python] νƒμš•λ²•(Greedy) : 체윑볡

2021. 3. 17. 16:48

문제 μ„€λͺ…

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

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

 

μ œν•œμ‚¬ν•­

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

 

μ •λ‹΅

def solution(n, lost, reserve):

    d_lost = list(set(lost) - set(reserve))
    d_reserve = list(set(reserve) - set(lost))

    for i in d_lost:
        if i + 1 in d_reserve:
            d_reserve.remove(i + 1)

        elif i - 1 in d_reserve:
            d_reserve.remove(i - 1)
        else:
            n = n-1

    return n

μš°μ„  lost와 reserve에 μ€‘λ³΅λ˜λŠ” 값이 있으면 μ—¬λ²Œ 옷이 μ—†λ‹€λŠ” μ˜λ―Έμ΄λ―€λ‘œ 두 λ°°μ—΄μ—μ„œ λͺ¨λ‘ μ‚­μ œν•΄μ•Όν•œλ‹€.

d_lost = list(set(lost) - set(reserve))
d_reserve = list(set(reserve) - set(lost))

set()은 집합 μžλ£Œν˜•μœΌλ‘œ ꡐ집합, 합집합, 차집합을 ꡬ할 λ•Œ μœ μš©ν•˜κ²Œ 쓰인닀.

-λ₯Ό μ΄μš©ν•˜μ—¬ 차집합을 κ΅¬ν•œ ν›„ λ‹€μ‹œ λ¦¬μŠ€νŠΈν™”ν•˜μ—¬ d_lost와 d_reserve에 λ„£μ–΄μ€€λ‹€.

for i in d_lost:
        if i + 1 in d_reserve:
            d_reserve.remove(i + 1)

        elif i - 1 in d_reserve:
            d_reserve.remove(i - 1)
        else:
            n = n-1

d_lost의 값보닀 1 큰 μˆ˜κ°€ d_reserve에 있으면 d_reserveμ—μ„œ ν•΄λ‹Ή 값을 μ‚­μ œν•˜κ³ 

d_lost의 값보닀 1 μž‘μ€ μˆ˜κ°€ d_reserve에 있으면 d_reserveμ—μ„œ ν•΄λ‹Ή 값을 μ‚­μ œν•œλ‹€.

두 수 λͺ¨λ‘ d_reserve에 μ—†λ‹€λ©΄ μ²΄μœ‘λ³΅μ„ 받지 λͺ»ν–ˆλ‹€λŠ” λœ»μ΄λ―€λ‘œ

전체 학생 수 n에 ν•΄λ‹Ή 학생을 μ œμ™Έν•œ 수인 n-1을 μ €μž₯ν•œλ‹€.

728x90

BELATED ARTICLES

more