1. 유형
DFS
2. 문제 설명
N이 5이기 때문에 총 경우의 수 N*N*2로 충분히 시간내에 들어오는 것이 가능합니다.
일반적인 현재 좌표가 숫자인지 기호인지에 따라 조건문으로 분기합니다.
그리고 일반적인 DFS템플릿을 사용하면 됩니다.
3. 코드
import java.io.*;
import java.util.*;
//나의 인생에는 수학과 함계
public class Main {
static char[][] mat;
static int D[][] = { { 0, 1 }, { 1, 0 } }, N, MAXVAL = -Integer.MAX_VALUE, MINVAL = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = stoi(st.nextToken());
mat = new char[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
mat[i][j] = st.nextToken().charAt(0);
}
}
dfs(0, 0, mat[0][0] - '0', ' ');
System.out.println(MAXVAL + " " + MINVAL);
}
static void dfs(int r, int c, int s, char cmd) {
if (r == N - 1 && c == N - 1) {
MAXVAL = Math.max(MAXVAL, s);
MINVAL = Math.min(MINVAL, s);
return;
}
for (int k = 0; k < 2; k++) {
int nr = r + D[k][0];
int nc = c + D[k][1];
if (nc < 0 || nc >= N || nr < 0 || nr >= N)
continue;
if (Character.isDigit(mat[nr][nc])) {
int CALC_RET = calc(s, mat[nr][nc] - '0', cmd);
dfs(nr, nc, CALC_RET, cmd);
} else {
dfs(nr, nc, s, mat[nr][nc]);
}
}
}
static int calc(int s, int cur, char cmd) {
int ss = 0;
switch (cmd) {
case '+':
ss = s + cur;
break;
case '-':
ss = s - cur;
break;
case '*':
ss = s * cur;
break;
}
return ss;
}
static int stoi(String s) {
return Integer.valueOf(s);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 2665 - 미로만들기 (0) | 2021.10.03 |
---|---|
백준 1005 - ACM Craft (0) | 2021.10.01 |
백준 1967 - 트리의지름 (0) | 2021.09.24 |
백준 1613 - 역사 (0) | 2021.09.23 |
백준 17255 - N으로 만들기 (0) | 2021.09.23 |