반응형
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
int result = Integer.MIN_VALUE;
int[][] num;
boolean[][] check;
int n;
int m;
int k;
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
public void solution() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
num = new int[n][m];
check = new boolean[n][m];
for(int i = 0; i<n; i++){
st = new StringTokenizer(br.readLine());
for(int j = 0; j<m; j++){
num[i][j] = Integer.parseInt(st.nextToken());
}
}
dfs(0,0,0,0);
System.out.println(result);
}
public void dfs(int x, int y, int sum, int depth){
if(depth == k){
result = Math.max(sum, result);
return;
}
for(int i = x; i<n; i++){
for(int j = y; j<m; j++){
if(!check[i][j]){
if(check(i, j)){
check[i][j] = true;
dfs(x,y, sum+num[i][j], depth+1);
check[i][j] = false;
}
}
}
}
}
public boolean check(int x, int y){
boolean flag = true;
for(int i=0; i<4; i++){
int currentX = x+dx[i];
int currentY = y+dy[i];
if(currentX>=0&¤tX<n&¤tY>=0&¤tY<m){
if(check[currentX][currentY]){
flag = false;
}
}
}
return flag;
}
public static void main(String args[]) throws IOException {
new Main().solution();
}
}
DFS와 백트래킹을 활용한다. 격자의 인덱스를 돌아 방문여부를 판단하고, 방문하지 않았고, 그 인덱스 동서남북이 방문한 적이 있는지 없는지를 체크(인접한 수) 없을시에 방문체크하고 다시 재귀... 체크 횟수가 K와 같아질때 가장 높은 값을 결과값에 저장 , 출력한다. 기본 값을 0으로 초기화 해놓을 경우, Math.max로는 격자가 모두 음수일 경우 가장 큰 숫자를 찾지 못하기 때문에 Math.MIN_VALUE로 초기화 해준다.
반응형
'개발 > 알고리즘' 카테고리의 다른 글
백준 1759번 : 암호 만들기 (0) | 2023.01.15 |
---|---|
백준 14501번 : 퇴사 (0) | 2023.01.11 |
백준 15656번 : N과 M (7) (0) | 2023.01.06 |
백준 15655번 : N과 M (6) (0) | 2023.01.06 |
백준 15654번 : N과 M (5) (0) | 2023.01.04 |