01. 가장 큰 정사각형 찾기
O와 X로 채워진 표가 있습니다. 표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다. 표에서 O로 이루어진 가장 큰 정사각형을 찾아 넓이를 반환하는 findLargestSquare 함수를 완성하세요. 예를 들어
1 2 3 4 5 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 가 있다면 정답은
1 2 3 4 5 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 가 되며 넓이는 9가 되므로 9를 반환해 주면 됩니다.
def findLargestSquare(board):
answer = 1
# board = list(map(lambda y: list(map(lambda x: 1 if x == "O" else 0, y)), board))
board = [[1 if x=="O" else 0 for x in y] for y in board]
results = [[0 for x in range(len(board[0]))] for y in range(len(board))]
results[0] = board[0]
for y in range(len(board)):
results[y][0] = board[y][0]
for y in range(1, len(board)):
for x in range(1, len(board[y])):
if board[y][x] == 1:
results[y][x] = min(results[y-1][x],
results[y-1][x-1],
results[y][x-1]) + 1
if results[y][x] > answer:
answer = results[y][x]
return answer ** 2
- 기본 알고리즘은 좌에서 부터 우로 탐색해 나가면서 지금 노드의 좌단, 좌상단, 상단의 크기 중 작은 것에 +1을 해준다.
min( r[y-][x], r[y-1][x-1], r[y][x-1] )
- 이렇게 하면 지금의 내 위치에 있는 숫자가 내 위치로부터 좌측까지의 정사각형의 크기가 된다.
- y축과 x축의 0번째 인덱스에서는 자신의 상단과 좌단의 크기에 접근하려면 오류가 발생하므로 각각 한줄씩 추가해 준다.