티스토리 뷰

알고리즘/백준

[백준] 14500번 테트로미노

머어하지 2018. 8. 17. 22:57

1) 생각

<테트로미노> 무슨말일까 했는데 아래와 같은 블록의 형태를 의미한다.


다른 블록의 형태의 경우에는 탐색을 통해 만들 수 있지만 'ㅜ' 형태의 모양은 만들기 어렵다.

딱, 저형태만 되는것은 아니고 저 도형이 회전한 모양이면 어느 모양이던 가능하다.

처음 Stack으로 DFS를 구현해보고 재귀를 통해서도 구현해 본결과 Stack으로 구현할 경우 '맞았습니다'는 뜨지만 반복작업이 많아지므로 메모리와 실행시간이 다음과 같이 차이가 나게된다.

그리고 이 문제처럼 입력이 띄엄띄엄 많이 주어진 경우 Scanner와 BufferedReader의 능력 차이를 쉽게 알아볼 수 있으므로 같은 코드에서 문자열 입력을 다르게 했을 때 생기는 차이는 다음과 같다.(Scanner는 1024chars의 버퍼 사이즈를 BufferedReader는 8192chars 사이즈를 처리할 수 있기 때문이다.)



따라서 입력의 개수가 많은 경우 BufferedReader를 쓰는것이 좋단걸 다시금 확인하였다.

2) 방안

'ㅜ','ㅏ','ㅓ','ㅗ'의 모양은 미리 모양을 배열로 지정해두고 탐색을 진행했고 그 외 나머지의 경우에는 DFS를 통해서 구현을 하였다.


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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main{
    static int n,m;
    public static void main(String[] args) 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());
        int[][] arr = new int[n][m];
        
        for(int i=0;i<n;i++) {
            st = new StringTokenizer(br.readLine());
            for(int j=0;j<m;j++)
                arr[i][j] = Integer.parseInt(st.nextToken());
        }
        visited = new boolean[n][m];
        
        // 점을 기준으로 4개 충족 구하기(solve1)
        // 구하기 힘든 모양 직접 구하기(solve2)
        for(int i=0;i<n;i++) {
            for(int j=0;j<m;j++) {
                solve(arr,i,j,1,arr[i][j]);
                solve2(arr,i,j);
            }
        }
        System.out.println(result);
    }
    static boolean[][] visited;
    static int[][] dir = {{1,0},{0,1},{-1,0},{0,-1}};
    static int result = 0;
    private static void solve(int[][] arr,int x,int y,int idx,int sum) {
        if(idx==4) {
            result = Math.max(result, sum);
            return;
        }
        if(idx>4return;
        visited[x][y] = true;
        for(int i=0;i<4;i++) {
            int tx = x+dir[i][0];
            int ty = y+dir[i][1];
            if(tx<0 || ty<0 || tx>=|| ty>=m) continue;
            if(visited[tx][ty]) continue;
            solve(arr,tx,ty,idx+1,sum+arr[tx][ty]);
        }
        visited[x][y] = false;
    }
    // ㅜ ㅏ ㅗ ㅓ
    static int[][][] shape = {{{0,0},{0,1},{0,2},{1,1}}
                             ,{{0,0},{1,0},{2,0},{1,1}}
                             ,{{0,0},{0,1},{0,2},{-1,1}}
                             ,{{0,0},{2,0},{1,0},{1,-1}}};
    
    private static void solve2(int[][] arr,int x,int y) {
        for(int i=0;i<4;i++) {
            int sum = 0;
            for(int j=0;j<4;j++) {
                int tx = x + shape[i][j][0];
                int ty = y + shape[i][j][1];
                if(tx<0 || ty<0 || tx>=|| ty>=m) break;
                sum += arr[tx][ty];
            }
            result = Math.max(result, sum);
        }
    }
}
cs


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

[백준] 1748번 수 이어 쓰기 1  (0) 2018.08.18
[백준] 6064번 카잉달력  (0) 2018.08.18
[백준] 1107번 리모콘  (0) 2018.08.17
[백준] 1261번 탈출  (0) 2018.08.15
[백준] 12851번 숨바꼭질 2  (0) 2018.08.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday