어흥

[백준 17265] 나의 인생에는 수학과 함께 (Java) 본문

알고리즘/백준

[백준 17265] 나의 인생에는 수학과 함께 (Java)

라이언납시오 2021. 7. 27. 19:07
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/17265

 

17265번: 나의 인생에는 수학과 함께

세현이의 인생의 목표는 1분 1초 모든 순간 수학과 함께 살아가는 것이다. 그렇기 때문에 매일 수학을 생각하면서 살아가고 있다. 세현이는 밥을 먹을 때도 쌀알의 수를 계산하여 칼로리를 바로

www.acmicpc.net

1. 주의할 점

- 이동 가능한 방법으로는 하하, 하우, 우하, 우우 총 4가지의 방법이 존재한다

 

2. 구현

- Check[][][] 배열을 통해 각 지점까지 이동할 때 얻을 수 있는 최대 및 최소값을 저장한다

- BFS() 함수를 2번 수행하여 한 번은 최대를, 다른 한번은 최소를 구하도록 한다

- BFS 탐색을 수행하기전, Check[][] 배열을 초기화하고 시작한다

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    static final int dx[] = {0,1};
    static final int dy[] = {1,0};
    static int num,mini,maxi;
    static char arr[][];
    static int check[][][];
    
    static class Info{
        int y,x,val;
        
        public Info(int y, int x, int val){
            this.y=y;
            this.x=x;
            this.val=val;
        }
    }
    
    //[][][0]: 최대, [][][1]: 최소
    static void bfs(int flag){
        //초기화
        for(int i=0;i<num;i++)
            for(int j=0;j<num;j++){
                if(flag==0) check[i][j][flag] = -4000;
                else check[i][j][flag] = 4000;
            }
        Queue<Info> q = new LinkedList<>();
        int val = arr[0][0]-'0';
        q.offer(new Info(0,0,val));
        check[0][0][flag]=val;
        while(!q.isEmpty()){
            Info ii = q.poll();
            int cy = ii.y;
            int cx = ii.x;
            int cv = ii.val;
            if(check[cy][cx][flag]!=cv) continue;
            for(int i=0;i<2;i++){
                int nx = cx+dx[i];
                int ny = cy+dy[i];
                if(nx==num || ny==num) continue;
                for(int j=0;j<2;j++){
                    int nnx = nx+dx[j];
                    int nny = ny+dy[j];
                    if(nnx<num && nny<num){
                        int nnv = arr[nny][nnx]-'0';
                        int nv = cv;
                        if(arr[ny][nx]=='+') nv+=nnv;
                        else if(arr[ny][nx]=='-') nv-=nnv;
                        else nv*=nnv;
                        if(flag==0){
                            if(check[nny][nnx][flag]<nv){
                                check[nny][nnx][flag]=nv;
                                q.offer(new Info(nny,nnx,nv));
                            }
                        }
                        else{
                            if(check[nny][nnx][flag]>nv){
                                check[nny][nnx][flag]=nv;
                                q.offer(new Info(nny,nnx,nv));
                            }
                        }
                    }
                }
            }
        }
        System.out.print(check[num-1][num-1][flag]+" ");
    }
    
	public static void main (String[] args) throws java.lang.Exception {
	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    num = Integer.parseInt(br.readLine().trim());
	    //초기화
	    arr = new char[num][num];
	    check = new int[num][num][2];
	    
	    for(int i=0;i<num;i++){
	        String str = br.readLine();
	        StringTokenizer st = new StringTokenizer(str);
	        for(int j=0;j<num;j++)
	            arr[i][j] = st.nextToken().charAt(0);
	    }
	    for(int i=0;i<2;i++)
	        bfs(i);
	}
}
728x90
반응형

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

[백준 2800] 괄호 제거 (C++)  (0) 2021.08.07
[백준 12904] A와 B (C++)  (0) 2021.08.07
[백준 22116] 창영이와 퇴근 (Java)  (0) 2021.07.27
[백준 1662] 압축 (Java)  (0) 2021.06.21
[백준 17616] 등수 찾기 (Java)  (0) 2021.06.17
Comments