백준

[백준][Kotlin]4883번 삼각 그래프

끝까지 처음처럼 2023. 6. 10. 03:51
728x90

해당 문제는 DP 문제입니다.

 

저의 경우 처음에는 혹시나 싶어 다익스트라 방식으로 작성해 봤었지만 메모리 초과라는 문제가 발생하여 이중 for문을 돌리면서 해당 위치값을 저장하고 있는 map 과 값을 갱신 및 누적할 map 을 생성하여 해당 문제를 작성하였습니다.

 

누적되는 map의 값을 구하는 방식을 구하는 것은 쉬웠으나 통과를 하지 못하여 식을 잘못 구한 듯 싶어 수정을 몇번 하였었지만 통과하지 못하였었습니다. 그래서 코드가 진행되는 과정에서 중간중간 출력문을 이용하여 값의 변경에 대해서 추적을 하여 문제를 찾았습니다.

 

제가 처음에 고려하지 못했던 문제는 값을 갱신하는 map에 있어 row값이 1 일 때 해당 row에 해당하는 col을 갱신할 때 올바른 값이 들어가지 않는다는 것을 알게되어 수정을 하여 해당 문제를 통과 할 수 있었습니다.

 

개인적으로 알고리즘 문제들을 풀면서 잘 안풀리는 경우 출력문을 통해 값의 변경과정을 확인해야 된다는 것을 다시금 깨닫게 해주는 문제였던 것 같습니다.

 

하기는 통과한 코드와 제출 결과 입니다.

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.util.StringTokenizer

fun main(){
    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    var case = 1

    while(true){
        var st = StringTokenizer(br.readLine())
        var N = st.nextToken().toInt()
        if(N == 0) break

        val map = Array(N) { LongArray(3) }
        val resultMap = Array(N) { LongArray(3)}
        // 확인할 배열 세팅
        repeat(N){
            st = StringTokenizer(br.readLine())
            map[it][0] = st.nextToken().toLong()
            map[it][1] = st.nextToken().toLong()
            map[it][2] = st.nextToken().toLong()
        }

        resultMap[0][1] = map[0][1]
        resultMap[0][2] = map[0][1] + map[0][2]

        for(row in 1 .. N-1){
            for(col in 0 .. 2){

                if(col == 0){
                    if(row == 1){
                        resultMap[row][col] = resultMap[0][1] + map[1][0]
                        continue
                    }
                    resultMap[row][0] = resultMap[row-1][0] + map[row][0]
                    resultMap[row][0] = Math.min(resultMap[row][0], resultMap[row-1][1] + map[row][0])
                }

                if(col == 1){

                    resultMap[row][1] = resultMap[row][0] + map[row][1] // 좌측에서 오는 거
                    resultMap[row][1] = Math.min(resultMap[row][1], resultMap[row-1][1] + map[row][1])
                    resultMap[row][1] = Math.min(resultMap[row][1], resultMap[row-1][2] + map[row][1])
                    if(row != 1) resultMap[row][1] = Math.min(resultMap[row][1], resultMap[row-1][0] + map[row][1])
                }

                if(col == 2){

                    resultMap[row][2] = resultMap[row][1] + map[row][2] // 좌측에서 오는 거
                    resultMap[row][2] = Math.min(resultMap[row][2], resultMap[row-1][1] + map[row][2])
                    resultMap[row][2] = Math.min(resultMap[row][2], resultMap[row-1][2] + map[row][2])
                }

            }
        }

        //bw.appendLine(resultMap.contentDeepToString())
        bw.appendLine("${case}. ${resultMap[N-1][1]}")

        case++

    }

    bw.flush()
    bw.close()
}