🧠 체윑볡

문제

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

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

λ‚˜μ˜ 풀이

def gymsuit(n, lost, reserve):
    for r in reserve[:]:
        if r in lost:
            reserve.remove(r)
            lost.remove(r)
    for r in reserve:
        if not lost:
            break
        else:
            for l in lost:
                if abs(l-r) == 1:
                    lost.remove(l)
                    break
    return n - len(lost)

이번 λ¬Έμ œμ—λŠ” κΌ­ 짚고 λ„˜μ–΄κ°€μ•Ό ν•  함정이 μžˆλ‹€. λ°”λ‘œ μ—¬λ²Œ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμ„ 수 μžˆλ‹€ λŠ” 점이닀. 이 λΆ€λΆ„ λ•Œλ¬Έμ— μš°μ„ μ μœΌλ‘œ μ—¬λ²Œ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생(r)이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ 학생 리슀트(lost)에 μžˆλŠ”μ§€ ν™•μΈν•˜κ³  μžˆμ„ κ²½μš°μ—λŠ” 두 개의 λ¦¬μŠ€νŠΈμ—μ„œ ν•΄λ‹Ή 학생을 μ œμ™Έν•΄μ•Ό ν–ˆλ‹€. 풀이 κ³Όμ •μ—μ„œ νŠΉλ³„ν•˜κ²Œ μ–΄λ €μš΄ 점은 μ—†μ—ˆμœΌλ‚˜ 이 λ¬Έμž₯ λ•Œλ¬Έμ— μ’€ 더 λ‹€μ–‘ν•œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ ν•„μš”ν–ˆλ‹€. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ—λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό ν†΅κ³Όν•˜μ§€ λͺ»ν–ˆμ„ λ•Œμ—λ„ ν•΄λ‹Ή ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό 확인할 수 없도둝 λ˜μ–΄μžˆμ–΄μ„œ μ–΄λ–€ λΆ€λΆ„μ—μ„œ μ—λŸ¬κ°€ λ‚¬λŠ”μ§€ ν•΄κ²°ν•˜κΈ°κ°€ νž˜λ“€μ—ˆλ‹€ γ… γ…  κ·Έλž˜μ„œ 직접 μ—¬λŸ¬ 가지 μΌ€μ΄μŠ€λ₯Ό λ§Œλ“€μ–΄λ³΄μ•˜λ‹€.

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€

class Test(unittest.TestCase):
    def test(self):
        self.assertEqual(gymsuit(5, [2, 4], [1, 3, 5]), 5)
        self.assertEqual(gymsuit(5, [2, 4], [3]), 4)
        self.assertEqual(gymsuit(3, [3], [1]), 2)
        self.assertEqual(gymsuit(8, [3, 4, 7], [1, 3, 5, 6]), 8)
        self.assertEqual(gymsuit(3, [1, 2], [2, 3]), 2)
        self.assertEqual(gymsuit(9, [2, 4, 7, 8], [3, 6, 9]), 8)
        self.assertEqual(gymsuit(5, [2, 4], [3, 5]), 5)

λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이

def gymsuit(n, lost, reserve):
    _reserve = [r for r in reserve if r not in lost]
    _lost = [l for l in lost if l not in reserve]
    for r in _reserve:
        f = r - 1
        b = r + 1
        if f in _lost:
            _lost.remove(f)
        elif b in _lost:
            _lost.remove(b)
    return n - len(_lost)

λΉ„μŠ·ν•œ λ°©λ²•μœΌλ‘œ ν’€μ—ˆμœΌλ‚˜ 크게 λ‹€λ₯Έ 점은 forλ¬Έκ³Ό if문을 ν•œ 쀄에 λλ‚΄λ²„λ Έλ‹€λŠ” 점이닀. 이처럼 μ’€ 더 파이썬슀럽게 지 수 μžˆλŠ” λ°©ν–₯으둜 μ—°μŠ΅ν•΄μ•Όκ² λ‹€.

References


Written by@ugaemi
Record things I want to remember

🐱 GitHubπŸ“š Reading Space