TIL/알고리즘 공부

백준 1931번 Swift 알고리즘 연습 - 회의실 배정_그리디

여의도사노비 2023. 2. 6. 01:53
728x90

백준 그리디 문제는 왜 전부 다 어려울까...

이 문제는 논리는 찾았는데 미숙한 나의 클로져 실력 때문에 meeting 배열을 sort하는 부분에서 여러 레퍼런스를 참고하였다.

 

 

이 문제를 풀면서 생각한 논리적 흐름은

  1. 여러가지 조건이 있을 수 있다. 가장 일찍 시작하는 회의, 가장 짧은 회의 등...
  2. 그런데 위의 여러가지 조건들을 다 따져보면 결국 반례가 생긴다.
  3. 그래서 결국 끝나는 시간이 가장 빠른 회의들을 기준으로 보면된다.
  4. 제일 빨리 끝나는 회의들 중 시작 시간이 다르고 끝나는 시간이 같은 경우들이 있다.
  5. 그런 경우 더 일찍 시작하는 회의를 앞으로 정렬한다.
  6. 이제 현재 시각(Now)과 회의 시작 시간([0])을 비교해주고 시작 시간이 현재 시각보다 크다면 그 미팅을 진행한다.
  7. 이때 진행한 미팅이 끝나는 시간을 Now에 대입함으로써 현재 시각의 상태를 바꿔준다.
  8. 이를 반복 + (ans += 1)

 

 

* 1931번

import Foundation

let number = Int(readLine()!)!
var meeting: [[Int]] = []
var now = -1
var ans = 0

for _ in 0..<number{
    let time = readLine()!.split(separator: " ").map({Int($0)!})
    meeting.append(time)
}

meeting.sort { (a: [Int], b: [Int]) -> Bool in
    if a[1] == b[1]{
        return a[0] < b[0]
    } else {
        return a[1] < b[1]
    }
}

for i in meeting {
    if i[0] >= now {
        now = i[1]
        ans += 1
    }
}

print(ans)

 

 

정리(Today I Learned)

  1. 요즘 클로져가 조금씩 익숙해지고 있다. sort, sorted 뿐만 아니라 map, filter, reduce 같은 고차함수에 워낙 클로져가 많이 들어가서 익숙해진 것 같다. 근데 막상 스스로 클로져문을 만들면 굉장히 힘들고 다른 분들의 코드를 참고해야 이해가 쓱 된다... 앞으로도 클로져를 더 애용해야겠다...!