백준 1931번 회의실배정 - kotlin
ATM 문제에 이어서 바로 연속으로 풀어보았다.
ATM이 너무 쉬웠던 탓에 조금 어려워 보이는 정답비율 28%의 회의실 배정 문제를 선택하였다.
문제
접근방법
문제를 읽고 끝나는 시간으로 정렬을 하고 앞 인덱스의 시작시간과 비교를 하면 될것 같다는 생각을 했다.
2차원배열을 이용하여 N by 2의 배열을 생성하여 접근하려고 했지만 코틀린으로 2차원배열을 구현해 본적이 없기에 검색을 통해 코드를 작성 해보았다.
끝나는 시간으로 정렬하기위해서는 arr[n][1] 중 2차원의 2번째 인덱스의 값을 비교해야하는게 꽤나 까다로웠고 라이브러리로 제공되는 비교함수는 2차원의 인덱스만으로 비교를 하기가 불가능한 형태여서 직접 구현을 해야했다.
좀 더 쉽고 빠른 방법이 없을까 고민을 하던중 Pair라는 키워드가 머리를 스쳤고, 곧바로 사용 방법을 검색하였다.
선언 : val pair = Pair<T,T>("객체","객체")
사용 : pair.first , pair.second 와 같은 방법으로 사용할수 있으며 이를 이용하여 list에 추가가 가능하다
val (a,b) = Pair("안녕","하세요") 이런식으로도 선언가능
list.add(Pair<a,b>)
이렇게 pair객체를 이용하여 sort함수에 적용한다면 간단하게 정렬을 구현할수 있었다.
list.sortWith(compareBy{it.second}) 라는 코드를 이용하여 정렬 할 수 있었다.
풀이소스
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
var size = StringTokenizer(readLine())br.nextToken().toInt() //회의의 갯수
val list = mutableListOf<Pair<Int,Int>>() //회의 시작시간 끝시간 쌍을 담을 리스트
var endTime = 0 //회의가 끝나는 시간
var cnt = 0 //회의실 사용 횟수
//회의 수만큼 반복
for (i in 0 until size) {
var (first, second) = readLine().split(" ").map{it.toInt() } //시작시간, 끝시간 입력
list.add(Pair(first,second)) //회의 리스트에 추가
}
list.sortWith(compareBy{it.first}) //시작시간으로 정렬 후(별의미없음)
list.sortWith(compareBy{it.second}) //종료시간으로 정렬을 해줌
//리스트 크기만큼 반복
for(i in 0 until list.size){
//시작시간이 마지막 종료시간보다 나중이면
if(list[i].first >= endTime){
cnt++ //사용횟수를 증가
endTime = list[i].second //마지막 종료시간을 현재회의의 종료시간으로 변경
}
}
print(cnt) //정답 출력
}
마침
이번 문제에서는 게시는 하지않았지만 2차원 배열을 이용하는 방법을 알게되었고 Pair 객체의 유용함을 배울 수 있었다. 꾸준히 문법공부에 투자해야겠다.