코딩문제풀이/Baekjoon

[Java] 백준 14722번 : 우유 도시

코딩하는 포메라니안 2023. 2. 15. 16:15

1. 문제

https://www.acmicpc.net/problem/14722

 

14722번: 우유 도시

영학이는 딸기우유, 초코우유, 바나나우유를 좋아한다. 입맛이 매우 까다로운 영학이는 자신만의 우유를 마시는 규칙이 있다.  맨 처음에는 딸기우유를 한 팩 마신다. 딸기우유를 한 팩 마신 후

www.acmicpc.net

 

 

2. 풀이 과정

배열의 크기가 1000x1000이므로, DFS와 같은 완탐으로는 시간 초과가 날 것 같아서 DP로 시도했다.

아직 DP문제는 푸는 데 시간이 좀 걸린다..

 

딸기 우유, 초코 우유, 바나나 우유 3가지 경우를 나눠서 생각하기 위해서 DP를 3차원 배열로 구현했다.

중간에 안 먹고 건너 뛸 수도 있어서 마지막에 어떤 종류를 먹었는지를 고려해주기 위해서다.

전체 배열을 2차원 배열로 탐색 + 우유 종류마다 반복문을 돌면서 자신의 위쪽과 왼쪽의 값 중 최댓값을 가져오며, 현재 위치에서 하나를 더 먹으면 최대가 되는지 확인하고 반영해주었다. 

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

public class Main {
    static int N;
    static int[][] map;
    static int[][][] result;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        N = Integer.parseInt(br.readLine());
        map = new int[N][N];
        result = new int[N][N][3];

        for(int i=0; i<N; i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<N; j++){
                map[i][j] = st.nextToken().charAt(0) - '0';
            }
        }

        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                int prev = (map[i][j] + 2)%3;
                int x = i - 1;
                int y = j - 1;
                for(int k=0; k<=2; k++){
                    result[i][j][k] = Math.max(0<=x ? result[x][j][k] : 0, 0<=y ? result[i][y][k] : 0);
                }
                if(result[i][j][prev]> 0){
                    result[i][j][map[i][j]] = Math.max(result[i][j][map[i][j]], result[i][j][prev] + 1);
                }

                if(map[i][j] == 0 && result[i][j][0] == 0){
                    result[i][j][0] = 1;
                }

            }
        }
        System.out.println(Math.max(Math.max(result[N-1][N-1][0], result[N-1][N-1][1]), result[N-1][N-1][2]));
    }

}

 

 

결과