μ•Œκ³ λ¦¬μ¦˜/Greedy

[λ°±μ€€ 1931 πŸ₯ˆ] νšŒμ˜μ‹€ λ°°μ •

1eehyunji 2023. 11. 30. 22:57

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

 

1931번: νšŒμ˜μ‹€ λ°°μ •

(1,4), (5,7), (8,11), (12,14) λ₯Ό μ΄μš©ν•  수 μžˆλ‹€.

www.acmicpc.net

문제

ν•œ 개의 νšŒμ˜μ‹€μ΄ μžˆλŠ”λ° 이λ₯Ό μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” N개의 νšŒμ˜μ— λŒ€ν•˜μ—¬ νšŒμ˜μ‹€ μ‚¬μš©ν‘œλ₯Ό λ§Œλ“€λ €κ³  ν•œλ‹€. 각 회의 I에 λŒ€ν•΄ μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ μ£Όμ–΄μ Έ 있고, 각 νšŒμ˜κ°€ κ²ΉμΉ˜μ§€ μ•Šκ²Œ ν•˜λ©΄μ„œ νšŒμ˜μ‹€μ„ μ‚¬μš©ν•  수 μžˆλŠ” 회의의 μ΅œλŒ€ 개수λ₯Ό μ°Ύμ•„λ³΄μž. 단, νšŒμ˜λŠ” ν•œλ²ˆ μ‹œμž‘ν•˜λ©΄ 쀑간에 쀑단될 수 μ—†μœΌλ©° ν•œ νšŒμ˜κ°€ λλ‚˜λŠ” 것과 λ™μ‹œμ— λ‹€μŒ νšŒμ˜κ°€ μ‹œμž‘λ  수 μžˆλ‹€. 회의의 μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ 같을 μˆ˜λ„ μžˆλ‹€. 이 κ²½μš°μ—λŠ” μ‹œμž‘ν•˜μžλ§ˆμž λλ‚˜λŠ” κ²ƒμœΌλ‘œ μƒκ°ν•˜λ©΄ λœλ‹€.

 

μž…λ ₯

첫째 쀄에 회의의 수 N(1 ≤ N ≤ 100,000)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ 쀄뢀터 N+1 μ€„κΉŒμ§€ 각 회의의 정보가 μ£Όμ–΄μ§€λŠ”λ° 이것은 곡백을 사이에 두고 회의의 μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ μ£Όμ–΄μ§„λ‹€. μ‹œμž‘ μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ€ 231-1보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜ λ˜λŠ” 0이닀.

 

좜λ ₯

첫째 쀄에 μ΅œλŒ€ μ‚¬μš©ν•  수 μžˆλŠ” 회의의 μ΅œλŒ€ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

문제 풀이

  • μ •λ ¬κ³Ό 그리디λ₯Ό μ΄μš©ν•΄μ„œ ν‘Ό λ¬Έμ œλ‹€.
  • μš°μ„  μ’…λ£Œ μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•œλ‹€.
    • μ™œλƒν•˜λ©΄ μ‹œμž‘ν•˜λŠ” μ‹œκ°„μ΄ λΉ λ₯΄λ”라도 μ’…λ£Œ μ‹œκ°„μ΄ λŠ¦λ‹€λ©΄ λ‹€λ₯Έ 회의λ₯Ό μ‹œμž‘ν•  수 μ—†λ‹€.
    • κ·ΈλŸ¬λ―€λ‘œ 더 λ§Žμ€ 수의 회의λ₯Ό λ°°μ •ν•˜λ €λ©΄ μ’…λ£Œμ‹œκ°„μ΄ λΉ λ₯Έ 순으둜 회의λ₯Ό λ°°μ •ν•΄μ•Ό ν•œλ‹€.
    • 단, μ’…λ£Œ μ‹œκ°„μ΄ 같은 κ²½μš°μ—” μ‹œμž‘ μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•œλ‹€.
      • μ™œλƒν•˜λ©΄ 더 λΉ λ₯Έ μ‹œμž‘ μ‹œκ°„μ„ λ¨Όμ € λ°°μΉ˜ν•΄μ•Ό μ’…λ£Œ μ‹œκ°„μ΄ 같은 λ‹€μŒ 회의λ₯Ό λ°°μ •ν•  수 있기 λ•Œλ¬Έμ΄λ‹€. 예λ₯Ό λ“ λ‹€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.
        • (1,1), (2,3), (3,3)κ³Ό 같은 회의 μ˜ˆμ • μ‹œκ°„μ΄ μžˆμ„ λ•Œ λ§Œμ•½ 같은 μ’…λ£Œμ‹œκ°„μ— λŒ€ν•œ μ‹œμž‘μ‹œκ°„μˆœ 정렬이 μ΄λ£¨μ–΄μ Έμžˆμ§€ μ•Šμ•„μ„œ (1,1), (3,3), (2,3)처럼 μ •λ ¬λ˜μ–΄ μžˆλ‹€λ©΄ (1,1), (2,3), (3,3) 총 3개의 회의λ₯Ό λ°°μ •ν•  수 μžˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  (1,1), (3,3)λ§Œμ„ μ„ νƒν•˜κ²Œ 되기 λ•Œλ¬Έμ΄λ‹€.
  • ν˜„μž¬ 회의 μ’…λ£Œ μ‹œκ°„μ„ μ •λ ¬λœ 회의 λͺ©λ‘μ„ κΈ°μ€€μœΌλ‘œ μ²« 번째 회의의 μ’…λ£Œ μ‹œκ°„μœΌλ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€.
  • 1번째 μœ„μΉ˜μ˜ νšŒμ˜λΆ€ν„° 탐색을 μ‹œμž‘ν•˜λ©΄μ„œ ν˜„μž¬ 회의 μ’…λ£Œ μ‹œκ°„(cur_endtime)κ³Ό 탐색 쀑인 회의의 μ‹œμž‘ μ‹œκ°„μ„ λΉ„κ΅ν–ˆμ„ λ•Œ μ’…λ£Œ μ‹œκ°„μ΄ μž‘κ±°λ‚˜ κ°™λ‹€λ©΄ ν•΄λ‹Ή 회의λ₯Ό λ°°μΉ˜ν•  수 있기 λ•Œλ¬Έμ— ν˜„μž¬ 회의 μ’…λ£Œ μ‹œκ°„(cur_endtime)을 탐색 쀑인 회의의 μ’…λ£Œ μ‹œκ°„μœΌλ‘œ κ°±μ‹ ν•˜κ³ , λ‹΅μ˜ 개수 answer을 +1 ν•΄μ€€λ‹€.
import sys

input=sys.stdin.readline

n=int(input())
meeting=[]
for _ in range(n):
    s,e=map(int, input().split(' '))
    meeting.append([s,e])

meeting.sort(key=lambda x:(x[1],x[0]))

cur_endtime=meeting[0][1]
answer=1
for i in range(1,n):
    # ν˜„μž¬ 회의의 μ’…λ£Œ μ‹œκ°„μ΄ λ‹€μŒ 회의 μ‹œμž‘ μ‹œκ°„λ³΄λ‹€ μž‘κ±°λ‚˜ κ°™λ‹€λ©΄ κ°€λŠ₯
    if cur_endtime<=meeting[i][0]:
        cur_endtime=meeting[i][1]
        answer+=1

print(answer)