λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
3️⃣ Swift/Problem Solving

[Swift Algorithm] νšŒμ˜μ‹€ λ°°μ • BOJ #1931

by seolhee2750 2021. 8. 18.
문제 μ„€λͺ…

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

 

μž…λ ₯

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

 

좜λ ₯

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

 

μž…μΆœλ ₯ 예제

μž…λ ₯

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

좜λ ₯

4

 

λ‚΄ 문제 풀이
import Foundation

let count = Int(readLine()!)! // 회의 총 개수
var times = [[Int]]() // 회의 μ‹œμž‘, 끝 μ‹œκ°„ μ €μž₯ν•˜λŠ” 2차원 λ°°μ—΄
var answer = 0

for _ in 0..<count  {
    let input = readLine()!.split(separator: " ").map({Int(String($0))!})
    times.append([input[0], input[1]])
}

times.sort(by: { $0[0] < $1[0] }) // μ‹œμž‘ν•˜λŠ” μ‹œκ°„ κΈ°μ€€ μ˜€λ¦„μ°¨μˆœ μ •λ ¬
times.sort(by: { $0[1] < $1[1] }) // λλ‚˜λŠ” μ‹œκ°„ κΈ°μ€€ μ˜€λ¦„μ°¨μˆœ μ •λ ¬

var check = 0

for i in times {
    if i[0] >= check {
        check = i[1]
        answer += 1
    }
}

print(answer)

πŸ‘‰ μ‹œμž‘ν•˜λŠ” μ‹œκ°„, λλ‚˜λŠ” μ‹œκ°„μ΄ 쌍으둜 ν•˜λ‚˜μ˜ μš”μ†Œλ₯Ό μ΄λ£¨λŠ” 2차원 배열을
μ‹œμž‘ν•˜λŠ” μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•œ λ’€, λ‹€μ‹œ λλ‚˜λŠ” μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•œλ‹€λŠ” 점이 포인트!

  • μ‹œμž‘ν•˜λŠ” μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ„ μ°¨λ‘€λŒ€λ‘œ times 2차원 배열에 μ €μž₯ν–ˆλ‹€.
  • 그리고 time 배열을 μ‹œμž‘ μ‹œκ°„ κΈ°μ€€ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ ν›„, 끝 μ‹œκ°„ κΈ°μ€€ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν–ˆλ‹€.
    μ΄λ ‡κ²Œ ν•œ μ΄μœ λŠ”, 같은 μ‹œμž‘ μ‹œκ°„μΌ 경우 λλ‚˜λŠ” μ‹œκ°„μ΄ λΉ λ₯Όμˆ˜λ‘ 효율적인 회의 배정이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
  • μœ„μ™€ 같이 μ •λ ¬ν•œ ν›„, time 배열을 μˆœμ„œλŒ€λ‘œ κ²€μƒ‰ν•˜λ©° 효율적인 νšŒμ˜λ“€μ„ 찾을 λ•Œλ§ˆλ‹€ answer에 +1 ν•΄μ£Όμ—ˆλ‹€.
    for문을 μžμ„Ένžˆ μ„€λͺ…ν•˜λ©΄, 예λ₯Ό λ“€μ–΄ [2, 3], [2, 5], [3, 6] μ΄λ ‡κ²Œ νšŒμ˜κ°€ μžˆμ„ 경우
    [2, 3] 회의의 λλ‚˜λŠ” μ‹œκ°„μΈ 3으둜 check λ³€μˆ˜λ₯Ό κ°±μ‹ ν•΄μ£Όκ³ ,
    κ·Έ λ‹€μŒμ—” check, 즉 3λΆ€ν„° μ‹œμž‘ν•˜λŠ” νšŒμ˜κ°€ μžˆλŠ”μ§€ 검색해쀀닀.
    [2, 5]λŠ” 2κ°€ 3보닀 μž‘μœΌλ―€λ‘œ κ·Έλƒ₯ λ„˜μ–΄κ°€κ³ , [3, 6] νšŒμ˜κ°€ if 쑰건에 ν•΄λ‹Ήλœλ‹€.

 

πŸ’‘ ν”Όλ“œλ°±
  • 그리디 λ¬Έμ œλ“€μ€ λŒ€μ²΄μ μœΌλ‘œ 정렬을 잘 ν™œμš©ν•΄μ•Ό ν•˜λŠ” λ¬Έμ œκ°€ λ§Žμ€ 것 κ°™λ‹€.
  • 처음 이 문제λ₯Ό ν’€μ—ˆμ„ λ•ŒλŠ” ν•œ 배열을 각각의 μš”μ†Œλ₯Ό κΈ°μ€€μœΌλ‘œ 두 번 μ •λ ¬ν•œλ‹€λŠ” 방법이
    μƒκ°λ‚˜μ§€ μ•Šμ•„ μ‹œκ°„μ΄ˆκ³Όλμ—ˆλŠ”λ°, 이런 방법도 μžˆλ‹€λŠ” 것을,, κΉ¨λ‹¬μœΌλ‹ˆ λ¬Έμ œκ°€ λ„ˆλ¬΄ κ°„κ²°νžˆ ν’€λ Έλ‹€.

 


 

문제

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

 

λŒ“κΈ€