ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 17265 나의 인생에는 수학과 함께
    백준/그래프 이론 2022. 5. 29. 17:35

     

     

    1. 풀이

     

    dfs를 이용해서 풀면된다.

     

    (1,1) 에서 시작해서,

    max 배열에는 연산 결과가 큰 값으로,

    min 배열에는 연산 결과가 작은 값으로 채우면 된다.

    그 후 max[N][N] 과, min[N][N] 을 출력하면 정답이 된다.

     

    아래 그림은 예제에서 일부분을 가져온 것이다.

    5가 입력되어 있는 부분은 (1,1)의 위치이다.

    이 때,

    (2,2) 위치에는

    두가지 연산이 있다.

     

     

    1) 오른쪽, 아래 이동

     

    5+3 = 8 이 먼저 연산되었다고 하자. 

     

    그러면 max[2][2] = 8 이 된다.

     

     

    2) 아래, 오른쪽 이동

     

     

    그 이후에 아래, 오른쪽 이동으로 

    5 * 3 = 15 가 결과로 나왔다면

     

    더 큰 값, 15로 바꿔주어 

    max[2][2] = 15 가 된다.

     

     

     

    2. 최종 코드

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    import java.util.StringTokenizer;
    
    public class Main {
    	
    	static int N;
    	static String input[][];
    	static int max[][];
    	static int min[][];
    	
    	
    	public static void main(String[] args) throws IOException {
    		
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		N = Integer.parseInt(br.readLine());
    		
    		input = new String[N+1][N+1];
    		
    		for(int i=1; i<=N; i++) {
    			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    			for(int j=1; j<=N; j++) {
    				input[i][j] = st.nextToken();
    			}
    		}
    	
    		max  = new int[N+1][N+1];
    		min  = new int[N+1][N+1];
    		
    		for(int i=0; i<=N; i++) {
    			Arrays.fill(min[i], Integer.MAX_VALUE);
    		}
    		
    		for(int i=0; i<=N; i++) {
    			Arrays.fill(max[i], Integer.MIN_VALUE);
    		}
    		
    		max[1][1] = Integer.parseInt(input[1][1]);
    		min[1][1] =  Integer.parseInt(input[1][1]);
    		
    		dfs(1,2, Integer.parseInt(input[1][1]), input[1][2], true);
    		dfs(1,2, Integer.parseInt(input[1][1]), input[1][2], false);
    		dfs(2,1, Integer.parseInt(input[1][1]), input[2][1], true);
    		dfs(2,1, Integer.parseInt(input[1][1]), input[2][1], false);
    		
    		System.out.println(max[N][N] + " " + min[N][N]);
    		
    	}
    	
    	public static void dfs(int x, int y, int number, String a, boolean check) {
    	
    			int dx [] = {0,1};
    			int dy [] = {1,0};
    			int result=0;
    			int nx = 0;
    			int ny = 0;
    	
    			if(((x+y)%2)!=0) {
    				
    				for(int i=0; i<2; i++ ) {
    					nx = x + dx[i];
    					ny = y + dy[i];
    					
    					if(nx>0 && ny >0 && nx<=N && ny<=N) {
    						
    					dfs(nx, ny, number, input[x][y], check);
    			      }
    					
    			   }
    			}else {
    				
    				if(a.equals("+")) {
    					
    					result = number + Integer.parseInt(input[x][y]);						
    						
    				}else if(a.equals("-")) {
    						
    					result = number - Integer.parseInt(input[x][y]);
    				
    				}else if(a.equals("*")) {
    						
    					result = number * Integer.parseInt(input[x][y]);
    					
    				}
    				
    				max[x][y] = Math.max(max[x][y], result);
    				min[x][y] = Math.min(min[x][y], result);
    					
    				for(int i=0; i<2; i++) {
    					nx = x + dx[i];
    					ny = y+ dy[i];
    					if(nx>0 && ny>0 && nx<=N && ny<=N) {
    					
    						if(check) {
    							dfs(nx, ny,max[x][y], a, true);
    						}else {
    							dfs(nx, ny,min[x][y], a, false);
    						}
    					}
    				}
    			}
    	}
    	
    }

     

     

    '백준 > 그래프 이론' 카테고리의 다른 글

    3055 탈출  (0) 2024.06.18
    1068 트리  (0) 2024.06.12
    14502 연구소  (2) 2024.06.10
    2606 바이러스  (0) 2022.01.24
    2644 촌수계산  (0) 2021.10.24

    댓글

Designed by Tistory.