-
[백준][Kotlin]4883번 삼각 그래프백준 2023. 6. 10. 03:51728x90
해당 문제는 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() }
'백준' 카테고리의 다른 글
[백준][Kotlin] 2302번 극장 좌석 (0) 2023.06.06 [백준][Kotlin]9461번 파도반 수열 (0) 2023.06.06 [백준][Kotlin]5427번 불 (0) 2023.05.28 [백준][Kotlin] 1854번 K번째 최단경로 찾기 (0) 2023.04.23 [백준][Kotlin] 1916번 최소비용 구하기 (0) 2023.04.20