코딩공작소
[DFS및예외처리]백준_테트로미노 본문
문제를 처음에 읽을 때는 시뮬레이션 문제인가 ..? 했었다.
먼저 입력포맷대로 코딩을 했다. 그리고 최대값을 구하는 문제라는 것을 보고 완전탐색으로 먼저 생각해보면서
최적화를 시켜보자라고 생각을 하였고 도형을 놓는 경우를 전부 다 따져보자하면서 생각을 해본 결과
도형의 대부분이 길이가 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 |