개발 블로그
article thumbnail

 

아이디어

시작점에서 임의의 i, j 까지 상승 비행 했을 때의 점수 + 임의의 i, j 에서 끝점까지 하강 비행 했을 때의 점수를 계산하고

모든 i, j 를 탐색하면서 그 값이 가장 큰 것을 출력하면 된다.

 

임의의 i, j 에서 끝점까지 하강 비행했을 때의 점수는 역으로 생각하면 끝점에서 임의의 i, j 까지 상승 비행 했을 때의 점수가 되므로 이를 활용해 문제를 해결하면 된다.

 

ascending[i][j] = Math.max(ascending[i + 1][j], ascending[i][j - 1]) + score[i][j]

 

descending[i][j] = Math.max(descending[i + 1][j], descending[i][j  + 1]) + score[i][j]

 

dp[i][j] = ascending[i][j] + descending[i][j]

 

 

풀이코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        int[][] scoreBoard = new int[N][M];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < M; j++) {
                scoreBoard[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int[][] ascending = new int[N][M];
        int[][] descending = new int[N][M];

        for (int i = N - 1; i >= 0; i--) {
            for (int j = 0; j < M; j++) {
                if (i + 1 < N && j - 1 >= 0) {
                    ascending[i][j] = Math.max(ascending[i + 1][j], ascending[i][j - 1]);
                }
                if (i + 1 >= N && j - 1 >= 0) {
                    ascending[i][j] = ascending[i][j - 1];
                }
                if (i + 1 < N && j - 1 < 0) {
                    ascending[i][j] = ascending[i + 1][j];
                }
                ascending[i][j] += scoreBoard[i][j];
            }

            for (int j = M - 1; j >= 0; j--) {
                if (i + 1 < N && j + 1 < M) {
                    descending[i][j] = Math.max(descending[i + 1][j], descending[i][j + 1]);
                }
                if (i + 1 >= N && j + 1 < M) {
                    descending[i][j] = descending[i][j + 1];
                }
                if (i + 1 < N && j + 1 >= M) {
                    descending[i][j] = descending[i + 1][j];
                }
                descending[i][j] += scoreBoard[i][j];
            }
        }

        int result = Integer.MIN_VALUE;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                int score = ascending[i][j] + descending[i][j];
                result = Math.max(result, score);
            }
        }

        System.out.println(result);
    }
}

'Algorithm > 백준 알고리즘' 카테고리의 다른 글

6064번. 카잉 달력  (0) 2023.10.19
2629번. 양팔저울  (0) 2023.10.19
21941번. 문자열 제거  (0) 2023.10.19
1695번. 팰린드롬 만들기  (0) 2023.10.17
2056번. 작업  (1) 2023.10.17
profile

개발 블로그

@하얀.손

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!