문제:
풀이 방법:
이 문제는 DP(dynamic programming), 동적계획법을 사용해서 풀어야 하는 문제이다. 왼쪽 위(1,1)부터 시작해서 오른쪽 아래로 진행을 하면서 정사각형을 나간다.
정사각형으로 취급되는 경우는 다음과 같다.
1(1번) |
1(2번) |
1(3번) |
1(4번) |
4번의 값이 0이 아니라면 1,2,3번의 값을 비교해 최소값을 찾은 뒤에 4번 자리에 그 최솟값에 1을 더한 값을 넣어 준다. 즉 다음과 같이 된다.
1(1번) | 1(2번) |
1(3번) | 2(4번) |
최솟값을 찾는 이유는 하나의 0이 있다면 정사각형의 형태가 아니므로 1 이상의 값들만 이어나가기 위함이다. 또한 1을 더해주는 이유는 정사각형이라면 길이의 값을 누적하기 위해서이고 아니라면 남은 1의 값들이 다른 곳에서 정사각형을 이룰 수 있기 때문에 이어나가주는 것이다.
이 문제의 예시를 통해서 구하는 방법을 알아보자. 다음과 같이 처음 상태가 있다.
0 |
1 |
1 | 1 |
1 |
1 |
1 | 1 |
1 |
1 |
1 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 1 | 1 |
1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 1 | 1 |
1 | 1 | 2 | 1 |
1 | 1 | 1 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 1 | 1 |
1 | 1 | 2 | 2 |
1 | 1 | 1 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 1 | 1 |
1 | 1 | 2 | 2 |
1 | 2 | 2 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 1 | 1 |
1 | 1 | 2 | 2 |
1 | 2 | 2 | 3 |
0 | 0 | 1 | 0 |
마지막 줄은 계속 진행해보아도 변경되는 점이 없으므로 이 예시의 가장 큰 정사각형은 길이가 3인 정사각형이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | def solution(board): max_point=0 for i in range(len(board)): max_point+=sum(board[i][:]) if max_point==0: return 0 max_point=0 for i in range(1,len(board)): for j in range(1,len(board[0])): if board[i][j]==0: continue else: min_point=min(board[i][j-1],board[i-1][j],board[i-1][j-1]) min_point+=1 board[i][j]=min_point if max_point < board[i][j]: max_point=board[i][j] if max_point==0: return 1 else: return max_point**2 | cs |
'Algorithm > Python' 카테고리의 다른 글
[Programmers]Lv 1. 체육복(테스트케이스 수정) (0) | 2019.03.03 |
---|---|
[Programmers]Lv 3. 이중우선순위큐 (1) | 2019.03.03 |
[Programmers]Lv 3. 입국 심사 (2) | 2019.03.01 |
[Programmers]Lv 2. 타겟 넘버 (0) | 2019.02.28 |
[Programmers]Lv 3. 정수 삼각형 (0) | 2019.02.27 |