λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
CS/μ•Œκ³ λ¦¬μ¦˜

λ°±μ€€ 2565 파이썬 - 전깃쀄 - 동적 κ³„νšλ²•, LIS

by πŸŒ»β™š 2021. 10. 15.

λ°±μ€€ 2565 파이썬

https://www.acmicpc.net/problem/2565

 

2565번: 전깃쀄

첫째 μ€„μ—λŠ” 두 μ „λ΄‡λŒ€ μ‚¬μ΄μ˜ μ „κΉƒμ€„μ˜ κ°œμˆ˜κ°€ 주어진닀. μ „κΉƒμ€„μ˜ κ°œμˆ˜λŠ” 100 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€. λ‘˜μ§Έ 쀄뢀터 ν•œ 쀄에 ν•˜λ‚˜μ”© 전깃쀄이 Aμ „λ΄‡λŒ€μ™€ μ—°κ²°λ˜λŠ” μœ„μΉ˜μ˜ λ²ˆν˜Έμ™€ Bμ „λ΄‡λŒ€μ™€ μ—°κ²°λ˜λŠ”

www.acmicpc.net

이번 λ¬Έμ œλŠ” 전깃쀄이 μ„œλ‘œ κ΅μ°¨ν•˜μ§€ μ•Šκ²Œ μ—†μ• μ•Όν•˜λŠ” μ „κΉƒμ€„μ˜ μ΅œμ†Œ 개수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€. μ²˜μŒμ— 문제λ₯Ό μ–΄λ–»κ²Œ 접근해야할지 λͺ¨λ₯΄κ² λ‹€κ³  μƒκ°ν–ˆλŠ”λ°... μ—­μ‹œ μ•Œκ³ λ¦¬μ¦˜μ€ 쒅이에 μ μ–΄κ°€λ©΄μ„œ 경우의 수λ₯Ό μ°Ύλ‹€λ³΄λ‹ˆ κ·œμΉ™μ„ μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. 이 λ¬Έμ œλ„ 이전에 ν’€μ—ˆλ˜ LIS 문제 :

[CS/μ•Œκ³ λ¦¬μ¦˜] - λ°±μ€€ 11053 파이썬 - κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄ - 동적 κ³„νšλ²•, LIS μ˜ μ—°μž₯μ„  μ‘μš©μ΄λ‹€.

 

μ „κΈΈμ€„μ˜ μ—°κ²° μ‹œμž‘μ μ„ κΈ°μ€€μœΌλ‘œ 도착 지점을 적어보면....

{8, 2, 9, 1, 4, 6, 7, 10}

μ„œλ‘œ μ „κΈΈ 쀄이 κ΅μ°¨ν•˜μ§€ μ•Šκ²Œ ν•˜λ €λ©΄... μ—°μ†μ μœΌλ‘œ μ¦κ°€ν•˜λŠ” μˆ«μžκ°€ ν•„μš”ν•˜λ‹€. 즉, κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄μ˜ 길이가 μ΅œλŒ€λ‘œ κ²ΉμΉ˜μ§€ μ•Šκ³  μ—°κ²°ν•  수 μžˆλŠ” μ „κΉƒ 쀄이닀.

 

Python 풀이

import sys
read = sys.stdin.readline

N = int(read())
lines = [list(map(int, read().split())) for _ in range(N)]
lines.sort(key=lambda x: x[0])
seq = [x[1] for x in lines]

counts = [seq[0]]
for i in range(1, N):
    if counts[-1] < seq[i]:
        counts.append(seq[i])
    else:
        idx = 0
        for j in range(len(counts)):
            if counts[j] < seq[i]:
                idx += 1
            else:
                counts[idx] = seq[i]
                break
print(N - len(counts))
  • μ¦κ°€ν•˜λŠ” κ°€μž₯ κΈ΄ λΆ€λΆ„ μˆ˜μ—΄μ„ κ΅¬ν•˜λŠ” λ‘œμ§μ€ 이전 λ¬Έμ œμ™€ λ˜‘κ°™λ‹€.
  • 차이가 μžˆλŠ” 뢀뢄은 μ—°κ²°λ˜λŠ” 선이 좜발점의 숫자λ₯Ό κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λ˜μ–΄μ•Όν•œλ‹€.
  • κ²°κ³ΌλŠ” 전체 μ „κΉƒμ€„μ—μ„œ μ¦κ°€ν•˜λŠ” κ°€μž₯ κΈ΄ λΆ€λΆ„ μˆ˜μ—΄μ˜ 길이λ₯Ό λΊ€ 값이닀.

λŒ“κΈ€