Algorithm/BOJ

λ°±μ€€(BOJ) 11000번 κ°•μ˜μ‹€λ°°μ • [그리디(Greedy)/μ•Œκ³ λ¦¬μ¦˜/파이썬(python)/큐]

DAHLIA CHOI 2021. 8. 6. 22:23
 

11000번: κ°•μ˜μ‹€ λ°°μ •

첫 번째 쀄에 N이 주어진닀. (1 ≤ N ≤ 200,000) 이후 N개의 쀄에 Si, Tiκ°€ 주어진닀. (1 ≤ Si < Ti ≤ 109)

www.acmicpc.net

 

 

문제

μˆ˜κ°•μ‹ μ²­μ˜ λ§ˆμŠ€ν„° κΉ€μ’…ν˜œ μ„ μƒλ‹˜μ—κ²Œ μƒˆλ‘œμš΄ κ³Όμ œκ°€ μ£Όμ–΄μ‘Œλ‹€. 

κΉ€μ’…ν˜œ μ„ μƒλ‹˜ν•œν…ŒλŠ” Si에 μ‹œμž‘ν•΄μ„œ Ti에 λλ‚˜λŠ” N개의 μˆ˜μ—…μ΄ μ£Όμ–΄μ§€λŠ”λ°, μ΅œμ†Œμ˜ κ°•μ˜μ‹€μ„ μ‚¬μš©ν•΄μ„œ λͺ¨λ“  μˆ˜μ—…μ„ κ°€λŠ₯ν•˜κ²Œ ν•΄μ•Ό ν•œλ‹€. 

참고둜, μˆ˜μ—…μ΄ λλ‚œ 직후에 λ‹€μŒ μˆ˜μ—…μ„ μ‹œμž‘ν•  수 μžˆλ‹€. (즉, Ti ≤ Sj μΌ 경우 i μˆ˜μ—…κ³Ό j μˆ˜μ—…μ€ 같이 듀을 수 μžˆλ‹€.)

μˆ˜κ°•μ‹ μ²­ λŒ€μΆ©ν•œ 게 찔리면, μ„ μƒλ‹˜μ„ λ„μ™€λ“œλ¦¬μž!

 

 

μž…λ ₯

첫 번째 쀄에 N이 주어진닀. (1 ≤ N ≤ 200,000)

이후 N개의 쀄에 Si, Tiκ°€ 주어진닀. (1 ≤ Si < Ti ≤ 109)

 

좜λ ₯

κ°•μ˜μ‹€μ˜ 개수λ₯Ό 좜λ ₯ν•˜λΌ.

 


전에 ν’€μ–΄λ΄€λ˜ 그리디 μ•Œκ³ λ¦¬μ¦˜μ΄λž‘ λ‹¬λΌμ„œ 계속 톡과 λͺ»ν•˜κ³  μžˆλ‹€κ°€ λ‚΄κ°€ 문제λ₯Ό 잘λͺ»μ΄ν•΄ν–ˆλ‹€λŠ”κ±Έ κΉ¨λ‹¬μ•˜λ‹€...

κ·Έ 전에 ν’€μ—ˆλ˜ λ¬Έμ œλŠ” μ΅œλŒ€ν•œ λ§Žμ€ μˆ˜μ—…μ„ 듀을 수 μžˆλŠ” 방법 or ν•œ κ°•μ˜μ‹€μ—μ„œ μ΅œλŒ€μ˜ κ°•μ˜μˆ˜ 이런걸둜 ν’€μ—ˆμ–΄μ„œ λλ‚˜λŠ” μ‹œκ°„μ΄ κ°€μž₯ λΉ λ₯Έ μˆœμ„œλŒ€λ‘œ μ •λ ¬ν•΄μ„œ λ‹€μŒ μ‹œμž‘μ‹œκ°„κ³Ό λΉ„κ΅ν•˜λŠ” λ°©λ²•μ΄μ—ˆλŠ”λ°, 이건 κ·Έ λ°˜λŒ€μ˜€λ˜...πŸ˜… ν•œμ°Έμ„ ν—€λ§Έλ‹€!!

 


✍ 문제 이해

  • λͺ¨λ“  μˆ˜μ—…μ„ λ“€μ–΄μ•Όν•œλ‹€.
  • λͺ¨λ“  μˆ˜μ—…μ„ λ“£κΈ° μœ„ν•΄μ„œ ν•„μš”ν•œ κ°€μž₯ μ΅œμ†Œμ˜ κ°•μ˜μ‹€ μˆ˜λŠ”?

예제λ₯Ό 그림으둜 λ‚˜νƒ€λ‚Έλ‹€λ©΄,
같은 μƒ‰μœΌλ‘œ 된 κ°•μ˜κ°€ 같은 κ°•μ˜μ‹€μ„ μ“΄λ‹€λŠ” 것이닀.
κ·Έλž˜μ„œ 총 2개의 κ°•μ˜μ‹€μ΄ ν•„μš”ν•˜λ‹€.

 

✍ 문제 풀이

κ°•μ˜ μ‹œμž‘ λ¦¬μŠ€νŠΈμ™€ μ’…λ£Œ 리슀트λ₯Ό 2차원 리슀트둜 λ¬Άκ³ , μ‹œμž‘ μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€.

heapqλ₯Ό μ‚¬μš©ν•˜λ©΄ λ¦¬μŠ€νŠΈκ°€ 항상 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 정렬이 λœλ‹€.

κ°•μ˜λŠ” λͺ¨λ‘ λ“€μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 처음 μ‹œμž‘ν–ˆλ˜ κ°•μ˜μ˜ λλ‚˜λŠ” μ‹œκ°„μ„ heapq에 λ„£κ³ , q리슀트의 μ΅œμ†Œκ°’κ³Ό λ‹€μŒ μˆ˜μ—…μ˜ μ‹œμž‘μ‹œκ°„μ„ λΉ„κ΅ν•œλ‹€.

λ§Œμ•½ λ‹€μŒ κ°•μ˜ μ‹œμž‘ μ‹œκ°„μ΄ 리슀트의 μ΅œμ†Œκ°’λ³΄λ‹€ 큰 값이라면 μ΅œμ†Œκ°’μ„ μ‚­μ œν•œλ‹€.

λ‹€μŒ κ°•μ˜μ˜ λλ‚˜λŠ” μ‹œκ°„μ„ qλ¦¬μŠ€νŠΈμ— λ„£λŠ”λ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ q리슀트의 길이λ₯Ό 좜λ ₯ν•˜λ©΄ 총 κ°•μ˜μ‹€ μˆ˜κ°€ λ‚˜μ˜¨λ‹€!

 

πŸ“ μ½”λ“œ

import heapq
import sys

def greedy_lecture_num(list):
    q = []
    heapq.heappush(q,list[0][1])
    
    for i in range(1, len(list)):
        if q[0] <= list[i][0]:
            heapq.heappop(q)
        heapq.heappush(q, list[i][1])
    return len(q)

N = int(sys.stdin.readline())
list = [[0 for j in range(2)] for i in range(N)]

for i in range(N):
    start, finish = map(int, sys.stdin.readline().split())
    list[i][0], list[i][1] = start, finish

list.sort(key=lambda x: x[0])

print(greedy_lecture_num(list))

 


python μ½”λ“œλ‘œ μ œμΆœν•  λ•Œ input()ν•¨μˆ˜ μ‚¬μš©ν•˜λ©΄ μ•ˆλ˜κ² λ‹€γ… γ…  자꾸 νƒ€μž„μ•„μ›ƒμ΄λ‹€..

μ•žμœΌλ‘œ κΌ­ sys.stdin.readline() μ‚¬μš©ν•΄μ•Όμ§€!!