출처
https://www.acmicpc.net/problem/2096
문제
N줄에 0 이상 9 이하의 숫자가 세 개씩 적혀 있다. 내려가기 게임을 하고 있는데, 이 게임은 첫 줄에서 시작해서 마지막 줄에서 끝나게 되는 놀이이다.
먼저 처음에 적혀 있는 세 개의 숫자 중에서 하나를 골라서 시작하게 된다. 그리고 다음 줄로 내려가는데, 다음 줄로 내려갈 때에는 다음과 같은 제약 조건이 있다. 바로 아래의 수로 넘어가거나, 아니면 바로 아래의 수와 붙어 있는 수로만 이동할 수 있다는 것이다. 이 제약 조건을 그림으로 나타내어 보면 다음과 같다.
별표는 현재 위치이고, 그 아랫 줄의 파란 동그라미는 원룡이가 다음 줄로 내려갈 수 있는 위치이며, 빨간 가위표는 원룡이가 내려갈 수 없는 위치가 된다. 숫자표가 주어져 있을 때, 얻을 수 있는 최대 점수, 최소 점수를 구하는 프로그램을 작성하시오. 점수는 원룡이가 위치한 곳의 수의 합이다.
입력
첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.
출력
첫째 줄에 얻을 수 있는 최대 점수와 최소 점수를 띄어서 출력한다.
풀이
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.StringTokenizer
import kotlin.math.*
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val N = br.readLine().toInt()
val numbers = Array(N){ Array(3){0} }
val minNumbers = Array(N){ Array(3){0} }
repeat(N) { x ->
val st = StringTokenizer(br.readLine())
repeat(3) { y ->
numbers[x][y] = st.nextToken().toInt()
minNumbers[x][y] = numbers[x][y]
}
}
for (i in 1 until N) {
numbers[i][0] += max(numbers[i-1][0], numbers[i-1][1])
numbers[i][1] += numbers[i-1].max()
numbers[i][2] += max(numbers[i-1][1], numbers[i-1][2])
minNumbers[i][0] += min(minNumbers[i-1][0], minNumbers[i-1][1])
minNumbers[i][1] += minNumbers[i-1].min()
minNumbers[i][2] += min(minNumbers[i-1][1], minNumbers[i-1][2])
}
println("${numbers[N-1].max()} ${minNumbers[N-1].min()}")
}
이번에도 다이나믹 프로그래밍 문제~
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
[Kotlin] BOJ 16953. A → B (0) | 2024.10.17 |
---|---|
[Kotlin] BOJ 13549. 숨바꼭질 3 (ft. 0-1 BFS) (0) | 2024.10.15 |
[Kotlin] BOJ 9461. 파도반 수열 (0) | 2024.10.10 |
[Kotlin] BOJ 2178. 미로탐색 (2) | 2024.10.08 |
[Kotlin] BOJ 9465. 스티커(ft. coerceAtLeast) (3) | 2024.10.01 |