알고리즘/그리디

백준 1931번 회의실배정 - kotlin

의탕 2020. 11. 4. 16:12

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 객체의 유용함을 배울 수 있었다. 꾸준히 문법공부에 투자해야겠다.