1 λΆ„ μ†Œμš”

λ°±μ€€ μ‚¬μ΄νŠΈ 링크

문제

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

μž…λ ₯

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

좜λ ₯

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

예제 μž…λ ₯ 1

11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14

예제 좜λ ₯ 1

4

힌트

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


풀이

  1. μž…λ ₯ 받은 νšŒμ˜λ“€μ„ μ’…λ£Œ μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬
  2. κ°€μž₯ 빨리 λλ‚˜λŠ” 회의λ₯Ό μ„ νƒν•˜κ³  μ„ νƒλœ 회의의 μ’…λ£Œ μ‹œκ°„μ„ λ³€μˆ˜ end_time에 μ €μž₯
  3. λ‚˜λ¨Έμ§€ νšŒμ˜λ“€μ„ μˆœνšŒν•˜λ©΄μ„œ, ν•΄λ‹Ή 회의의 μ‹œμž‘ μ‹œκ°„μ΄ end_time보닀 ν¬κ±°λ‚˜ 같은 κ²½μš°μ—λ§Œ 회의λ₯Ό 선택
  4. μ„ νƒλœ 회의의 μ’…λ£Œ μ‹œκ°„μ„ λ‹€μ‹œ end_time에 μ €μž₯
  5. μ„ νƒλœ 회의의 수λ₯Ό 카운트

μ½”λ“œ

ver(1) - Greedy μ‚¬μš©

μ‹œκ°„ λ³΅μž‘λ„λŠ” O(nlogn)

n = int(input())

# 회의 일정을 리슀트의 리슀트둜 μž…λ ₯λ°›μŠ΅λ‹ˆλ‹€.
t = [list(map(int, input().split())) for _ in range(n)]

# 회의 일정을 끝 μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜κ³ , 끝 μ‹œκ°„μ΄ 같은 경우 μ‹œμž‘ μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•©λ‹ˆλ‹€.
t.sort(key=lambda x: (x[1], x[0]))

cnt = 0  # μ΅œλŒ€λ‘œ μ˜ˆμ•½ν•  수 μžˆλŠ” 회의 수λ₯Ό μ„ΈλŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.
last = 0  # λ§ˆμ§€λ§‰μœΌλ‘œ μ„ νƒλœ 회의의 끝 μ‹œκ°„μ„ κΈ°λ‘ν•˜λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.

for i, j in t:
    # ν˜„μž¬ 회의의 μ‹œμž‘ μ‹œκ°„μ΄ λ§ˆμ§€λ§‰μœΌλ‘œ μ„ νƒλœ 회의의 끝 μ‹œκ°„λ³΄λ‹€ ν¬κ±°λ‚˜ κ°™μœΌλ©΄
    if i >= last:
        cnt += 1  # μ˜ˆμ•½λœ 회의 수λ₯Ό μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€.
        last = j  # λ§ˆμ§€λ§‰μœΌλ‘œ μ„ νƒλœ 회의의 끝 μ‹œκ°„μ„ ν˜„μž¬ 회의의 끝 μ‹œκ°„μœΌλ‘œ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

print(cnt)  # μ΅œλŒ€λ‘œ μ˜ˆμ•½ν•  수 μžˆλŠ” 회의 수λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

λŒ“κΈ€λ‚¨κΈ°κΈ°