문제를 처음에 읽을 때는 시뮬레이션 문제인가 ..? 했었다.
먼저 입력포맷대로 코딩을 했다. 그리고 최대값을 구하는 문제라는 것을 보고 완전탐색으로 먼저 생각해보면서
최적화를 시켜보자라고 생각을 하였고 도형을 놓는 경우를 전부 다 따져보자하면서 생각을 해본 결과
도형의 대부분이 길이가 4인 dfs라는 것을 깨닫고 dfs문제 구나 !! 생각했다.
그 후, 뒤늦게 안 사실은 ㅏ,ㅓ,ㅜ,ㅗ 모양의 블록은 dfs로 탐색할 수 없다는 것(예외블록)을 알았다.
그리고 확인해본 결과 2차 배열의 각 모든 점에대해서 dfs를 따져서 최대값을 비교해야 한다는 것을 깨달았다.
한가지 배운 사실은 isV=True --> dfs --> isV=false 형식으로 해당 값에서만 isV유지하고 끝나면 다시 false로 초기화
시켜주는 과정이었다.
그리고 4방향으로 탐색을 해주는 방법은 하두 많이 나와서..
먼저 dfs 부분은 위와 같이 코딩했다. 이 부분은 많은 문제와 비슷한 포맷. 파라미터로 sum 변수를 쭉 가지고 들어가서
ans와 비교 후 최대 값을 저장해주는 방식.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
static int [][]Map;
static boolean [][]isV;
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1}; // 상 , 하, 좌 , 우
static int N,M;
static int ans=-1;
public static void dfs(int x,int y,int len,int sum) {
if(len == 4) {
ans = Math.max(ans, sum);
return ;
}
for(int i=0;i<4;i++) {
int XX = x +dx[i];
int YY = y + dy[i];
if(0<=XX && XX < N && YY>=0 && YY < M) {
if(isV[XX][YY] == false) {
isV[XX][YY] = true;
dfs(XX,YY,len+1,sum+Map[XX][YY]);
isV[XX][YY]=false;
}
}
}
}
|
cs |
예외 도형에 대해서는 다양한 인터넷의 방법들이 있었지만, 나만의 방법을 생각해보기로 했고, 각 점마다
ㅏ,ㅓ,ㅜ,ㅗ 를 전부 따져 주자고 생각하였고 범위 검사만 해주면 되겠다고 생각했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
import java.util.*;
public class Main {
static int [][]Map;
static boolean [][]isV;
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1}; // 상 , 하, 좌 , 우
static int N,M;
static int ans=-1;
public static void dfs(int x,int y,int len,int sum) {
if(len == 4) {
ans = Math.max(ans, sum);
return ;
}
for(int i=0;i<4;i++) {
int XX = x +dx[i];
int YY = y + dy[i];
if(0<=XX && XX < N && YY>=0 && YY < M) {
if(isV[XX][YY] == false) {
isV[XX][YY] = true;
dfs(XX,YY,len+1,sum+Map[XX][YY]);
isV[XX][YY]=false;
}
}
}
}
public static void PLUS(int i, int j) {
//ㅏ
if(i-1 >= 0 && j+1 < M && i+1 < N) {
ans=Math.max(ans, Map[i][j]+Map[i-1][j]+Map[i][j+1]+Map[i+1][j]);
}
//ㅜ
if(j-1 >= 0 && i+1 < N && j+1 < M) {
ans=Math.max(ans, Map[i][j]+Map[i][j-1]+Map[i+1][j]+Map[i][j+1]);
}
//ㅓ
if(j-1>=0 && i-1 >=0 && i+1 < N) {
ans=Math.max(ans, Map[i][j]+Map[i][j-1]+Map[i-1][j]+Map[i+1][j]);
}
//ㅗ
if(j-1>=0 && i-1>=0 && j+1 < M) {
ans=Math.max(ans, Map[i][j]+Map[i][j-1]+Map[i-1][j]+Map[i][j+1]);
}
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
Map = new int[N][M];
isV = new boolean[N][M];
for(int i=0;i<N;i++) {
for(int j=0;j<M;j++){
Map[i][j]=sc.nextInt();
}
}
for(int i=0;i<N;i++) {
for(int j=0;j<M;j++) {
isV[i][j]=true;
dfs(i,j,1,Map[i][j]);
PLUS(i,j);
isV[i][j]=false;
}
}
System.out.println(ans);
}
}
|
cs |
'알고리즘 > 그래프' 카테고리의 다른 글
[DFS]백준_로봇청소기 (0) | 2019.04.10 |
---|---|
[완탐/BFS]백준_연구소 (0) | 2019.04.08 |
[그래프BFS]백준1012유기농배추 (0) | 2019.03.10 |
[그래프BFS]토마토 백준7576 (0) | 2019.03.08 |
[BFS/DFS]기초 (0) | 2019.03.05 |