728x90
백준 그리디 문제는 왜 전부 다 어려울까...
이 문제는 논리는 찾았는데 미숙한 나의 클로져 실력 때문에 meeting 배열을 sort하는 부분에서 여러 레퍼런스를 참고하였다.
이 문제를 풀면서 생각한 논리적 흐름은
- 여러가지 조건이 있을 수 있다. 가장 일찍 시작하는 회의, 가장 짧은 회의 등...
- 그런데 위의 여러가지 조건들을 다 따져보면 결국 반례가 생긴다.
- 그래서 결국 끝나는 시간이 가장 빠른 회의들을 기준으로 보면된다.
- 제일 빨리 끝나는 회의들 중 시작 시간이 다르고 끝나는 시간이 같은 경우들이 있다.
- 그런 경우 더 일찍 시작하는 회의를 앞으로 정렬한다.
- 이제 현재 시각(Now)과 회의 시작 시간([0])을 비교해주고 시작 시간이 현재 시각보다 크다면 그 미팅을 진행한다.
- 이때 진행한 미팅이 끝나는 시간을 Now에 대입함으로써 현재 시각의 상태를 바꿔준다.
- 이를 반복 + (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)
- 요즘 클로져가 조금씩 익숙해지고 있다. sort, sorted 뿐만 아니라 map, filter, reduce 같은 고차함수에 워낙 클로져가 많이 들어가서 익숙해진 것 같다. 근데 막상 스스로 클로져문을 만들면 굉장히 힘들고 다른 분들의 코드를 참고해야 이해가 쓱 된다... 앞으로도 클로져를 더 애용해야겠다...!
'TIL > 알고리즘 공부' 카테고리의 다른 글
LeetCode Swift - 611. Valid Triangle Number_Greedy (0) | 2023.02.09 |
---|---|
프로그래머스 Lv. 2 Swift 알고리즘 - 구명보트_그리디 (0) | 2023.02.06 |
백준 1541번 Swift 알고리즘 연습 - 잃어버린 괄호_그리디 (0) | 2023.02.06 |
백준 10610번 Swift 알고리즘 연습 - 30_그리디 (0) | 2023.02.04 |
백준 1449번 Swift 알고리즘 연습 - 수리공 항승_그리디 (0) | 2023.02.04 |