ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준][Kotlin] 1916번 최소비용 구하기
    백준 2023. 4. 20. 15:58
    728x90

    해당문제는 다익스트라 알고리즘을 사용하여 작성 할 수 있었습니다.

     

    다익스트라 알고리즘은 거리배열우선순위큐를 이용하여 가중치가 적은 자료부터 확인하는 로직,그리고 방문했던 노드 재방문 방지 등에 대한 로직에 대한 이해를 하고 있다면 쉽게 작성할 수 있는 알고리즘이라고 개인적으로 생각이 듭니다.

    해당 문제는 코드 내에 주석을 이용하여 설명을 적어 쉽게 이해 할 수 있도록 하였습니다.

     

    하기는 제가 작성한 코드와 제출 결과 입니다.

     

    import java.io.BufferedReader
    import java.io.BufferedWriter
    import java.io.InputStreamReader
    import java.io.OutputStreamWriter
    import java.util.*
    import kotlin.collections.ArrayList
    
    fun main() {
        val br = BufferedReader(InputStreamReader(System.`in`))
        val bw = BufferedWriter(OutputStreamWriter(System.out))
        var st = StringTokenizer(br.readLine())
    
        val N = st.nextToken().toInt() // 도시의 개수
        st = StringTokenizer(br.readLine())
        val M = st.nextToken().toInt() // 버스의 개수
        val buslist = Array(N+1,{ArrayList<Info>()})
    
        repeat(M){
            st = StringTokenizer(br.readLine())
            buslist[st.nextToken().toInt()].add(Info(st.nextToken().toInt(),st.nextToken().toInt()))
        }
        st = StringTokenizer(br.readLine())
        val startcity = st.nextToken().toInt() // 출발 도시
        val endcity = st.nextToken().toInt() // 도착 도시
        val moneylist = IntArray(N+1){ Int.MAX_VALUE} // 도시 별 소요되는 돈 저장 배열
        val visit = BooleanArray(N+1)
        val pq = PriorityQueue<Info>(kotlin.Comparator { o1, o2 ->  o1.money.compareTo(o2.money)})
        // 돈이 적은 순으로 정렬
        pq.add(Info(startcity,0)) // 출발 도시부터 출발도시는 소요비용 0
        moneylist[startcity] = 0
    
        while(!pq.isEmpty()){
            val now = pq.poll().target
            if(visit[now])continue // 이미 방문했던 도시라면 재방문하지 않음
            visit[now] = true
    
            for(next in buslist[now]){ // 현재 도시에서 갈 수 있는 도시 확인
                if(moneylist[next.target] > moneylist[now] + next.money){
                // 다음 도시에 갈 수 있는 미리 저장된 돈과 
                // 현재 도시에서 다음도시에 갈 수 있는 비용 비교
                    moneylist[next.target] = moneylist[now] + next.money
                    pq.add(Info(next.target,moneylist[next.target])) 
                    // buslist[now]에서 (2,3),(2,1) 이런 식으로 나왔더라도
                    // pq의 정렬 조건에 의해 추후 비교할때는 (2,1)이 먼저 나옴
                    // 그렇기에 추후(2,1)을 이용하여 moneylist를 갱신하고 (2,3)이 
                    // 나왔을 경우에는 상단 if문을 이용한 continue문 이후를 통과하지 못홤
                    // 입력 순서만 따지면 (2,3),(2,1)이 맞지만 
                    // 반대로 출력할때는 (2,1),(2,3) 으로 나옴
                }
            }
        }
    
        bw.append(moneylist[endcity].toString())
    
        bw.flush()
        bw.close()
    }
    
    data class Info(
        val target:Int,
        val money:Int
    )

    '백준' 카테고리의 다른 글

    [백준][Kotlin]5427번 불  (0) 2023.05.28
    [백준][Kotlin] 1854번 K번째 최단경로 찾기  (0) 2023.04.23
    [백준][Kotlin]1753 최단경로  (0) 2023.04.20
    [백준][Kotlin]1948번 임계경로  (0) 2023.04.19
    [백준][Kotlin]16562번 친구비  (0) 2023.04.17
Designed by Tistory.