문제 : boj15645
ps. 코틀린의 경우 대강 인터넷 검색해서 문법을 익혔으므로 아직 늅늅이 상태여서 많이 어색하게 짰다.
이 문제의 경우 dp로 풀면 쉽게 풀린다. 알아야 하는 정보는 바로 직전 3칸의 합계 뿐이다(시작할때는 당연히 셋 다 0이라고 치면 된다.).
N개의 줄을 입력받으면서, 매번 해당 칸으로 올 수 있는 값 중 최대와 최소값을 갱신 후에 현재 줄에서 입력받은 값을 더해주면 된다. dp[a][b]가 a라인까지 입력받았을 때 b번째(0,1,2로 3개) 칸까지의 최대합계라고 해보자. 그렇다면
dp[x][0] = max(dp[x-1][0], dp[x-1][1]) + 입력받은 0번째 값
dp[x][1] = max(dp[x-1][0], dp[x-1][1], dp[x-1][2]) + 입력받은 1번째 값
dp[x][2] = max(dp[x-1][1], dp[x-1][2]) + 입력받은 2번째 값
이 될 것이다. 그렇다면 최종적으로 N개의 줄을 모두 입력받은 후 최대 점수는 max(dp[n][0], dp[n][1], dp[n][2])가 될 것이다. 최소값은 위에서 max대신 min 값을 판단해주면 된다.
이하 코드에서 코틀린으로 짠 코드의 경우엔 어차피 바로 직전의 정보만 알면 되므로 3칸짜리 배열을 사용해 dp를 진행했다. 코틀린은 아직 어색하므로 자바로 새로짜본 거에선 똑같은 로직으로 하면 재미없으니 dp[a][b][c]를 a번째 줄의 b번째 열의 최대(c=0), 최소(c=1)로 정의해 짜봤다.
코드(코틀린) : github
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.StringTokenizer
const val VALUE_SUM_LIMIT = 9*100000+1
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
var n = readLine().toInt()
var max = Array(3){0}
var min = Array(3){0}
while(n-->0) {
val st = StringTokenizer(readLine())
val maxTmp = Array(3){0}
val minTmp = Array(3){VALUE_SUM_LIMIT}
var i = 0
while (st.hasMoreTokens()) {
val cur = st.nextToken().toInt()
for (j in i-1..i+1) {
if (j < 0 || j >= 3) continue
maxTmp[i] = Math.max(maxTmp[i], max[j])
minTmp[i] = Math.min(minTmp[i], min[j])
}
maxTmp[i]+=cur
minTmp[i]+=cur
i++
}
max = maxTmp
min = minTmp
}
println("${max.toList().maxOrNull()} ${min.toList().minOrNull()}")
}
코드(자바) : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static final int VALUE_SUM_LIMIT = 9*100000+1;
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][][] dp = new int[n+1][3][2];
for (int i = 1; i <= n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < 3; j++) {
int cur = Integer.parseInt(st.nextToken());
dp[i][j][1] = VALUE_SUM_LIMIT;
for (int k = j-1; k <= j+1; k++) {
if (k < 0 || k >= 3) continue;
dp[i][j][0] = Math.max(dp[i][j][0], dp[i-1][k][0]);
dp[i][j][1] = Math.min(dp[i][j][1], dp[i-1][k][1]);
}
dp[i][j][0]+=cur;
dp[i][j][1]+=cur;
}
}
int max = Math.max(dp[n][0][0], Math.max(dp[n][1][0], dp[n][2][0]));
int min = Math.min(dp[n][0][1], Math.min(dp[n][1][1], dp[n][2][1]));
System.out.println(max + " " + min);
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
[코틀린, 자바] 백준 25214 - 크림 파스타 (boj kotlin java) (0) | 2022.07.11 |
---|---|
[코틀린, 자바] 백준 14651 - 걷다보니 신천역 삼 (Large) (boj kotlin java) (0) | 2022.07.10 |
[자바] 백준 10409 - 서버 (boj java) (0) | 2022.07.08 |
[자바] 백준 9295 - 주사위 (boj java) (0) | 2022.07.07 |
[자바] 백준 23795 - 사장님 도박은 재미로 하셔야 합니다 (boj java) (0) | 2022.07.06 |
댓글