빠에야는 개발중

가장 큰 정사각형 찾기 본문

공부/알고리즘 문제

가장 큰 정사각형 찾기

빠에야좋아 2018. 3. 10. 17:22

O와 X로 채워진 표가 있습니다. 표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다. 표에서 O로 이루어진 가장 큰 정사각형을 찾아 넓이를 반환하는 findLargestSquare 함수를 완성하세요. 예를 들어

12345
XOOOX
XOOOO
XXOOO
XXOOO
XXXXX

가 있다면 정답은

12345
XOOOX
XOOOO
XXOOO
XXOOO
XXXXX

가 되며 넓이는 9가 되므로 9를 반환해 주면 됩니다.


처음에는 "모든 칸에서 각 길이만큼 가능한 정사각형을 구해서 최대값을 저장한다."라는 생각으로 n중 for문을 사용했는데 보기좋게 타임아웃이 났다. 그래서 좀 더 생각해보니 d[n,m]이 (n,m)의 최대 정사각형 크기라면 d[i-1,j-1], d[i, j-1], d[i-1, j]의 최소값 + 1이 d[i,j]값이 된다는 사실을 알아냈다. 어떤 정사각형이 만들어지려면 그것보다 한칸 앞의 칸에서도 정사각형이 만들어져야하기 때문이다. 스스로도 생각하고 놀랐다. 뭔가 성장한 느낌이 또 들었다. ㅎㅎ


먼저 첫 행, 첫 열을 검사하여 초기화 해주고 (1,1)부터 반복문을 돌려주었다.


그런데 문제는 제출을 하니 정답이 아니라고 나온다. 검색해서 다른 답과 비교해도 다를 것이 없는데... 사이트 내의 에러인 듯 하다.

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
77
//n중 for문(timeout)
class LargestSquare {
    public int findLargestSquare(char[][] board) {
        int answer = 0;
        int size = 0;
        boolean token = true;
 
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                int edge = Integer.min(i, j);
                for (int m = 0; m <= edge; m++) {
                    for (int k = i; k > i-edge; k--) {
                        for (int l = j; l > j-edge; l--) {
                            if (board[k][l] == 'X') {
                                token = false;
                            }
 
                        }
                    }
                    if(token==true) {
                        size=edge;
                    } else {
                        token=true;
                        break;
                    }
                }
                answer = Integer.max(answer, size);
            }
        }
 
        return answer*answer;
    }
 
    public static void main(String[] args) {
        LargestSquare test = new LargestSquare();
        char[][] board = { { 'X''O''O''O''X' }, { 'X''O''O''O''O' }, { 'X''X''O''O''O' },
                { 'X''X''O''O''O' }, { 'X''X''X''X''X' } };
 
        System.out.println(test.findLargestSquare(board));
    }
}
 
//dp
class LargestSquare {
    public int findLargestSquare(char[][] board) {
        int answer = 0;
        int[][] arr = new int[board.length][board[0].length];
 
        for(int i = 0; i<board.length;i++) {
            arr[0][i] = board[0][i] == 'O' ? 1 : 0;
        }
        for(int j = 0; j<board[0].length;j++) {
            arr[j][0= board[j][0== 'O' ? 1 : 0;
        }
        
        for(int i = 1;i<arr.length;i++) {
            for(int j = 1;j<arr[0].length;j++) {
                if(board[i][j] == 'O') {
                    arr[i][j] = Integer.min(Integer.min(arr[i-1][j-1], arr[i][j-1]), arr[i-1][j])+1;
                    answer= answer > arr[i][j] ? answer : arr[i][j];
                } else {
                    arr[i][j] = 0;
                }
            }
        }
 
        return answer*answer;
    }
 
    public static void main(String[] args) {
        LargestSquare test = new LargestSquare();
        char[][] board = { { 'X''O''O''O''X' }, { 'X''O''O''O''O' }, { 'X''X''O''O''O' },
                { 'X''X''O''O''O' }, { 'X''X''X''X''X' } };
 
        System.out.println(test.findLargestSquare(board));
    }
}
cs


'공부 > 알고리즘 문제' 카테고리의 다른 글

땅따먹기  (0) 2018.03.11
공항 건설하기  (0) 2018.03.11
최고의 집합  (0) 2018.03.09
숫자의 표현  (0) 2018.03.08
야근 지수  (0) 2018.03.07
Comments