프로그래머스발행일 2025. 6. 23.원본 https://blog.naver.com/jword_/223909146640 ↗

Matrix - 가장 큰 정사각형 찾기

Matrix - 가장 큰 정사각형 찾기 — #코딩테스트 #DP #프로그래머스 사용된 언어: 코틀린, 혹은 파이썬 순서: 로직, 코드 구현, 코드 분석 기...

#프로그래머스#Naver Blog

#코딩테스트 #DP #프로그래머스

​

​

  • 사용된 언어: 코틀린, 혹은 파이썬
  • 순서: 로직, 코드 구현, 코드 분석

기출문제

Programmers - \[PCCE 기출문제\] 10번

​

이미지

[코딩테스트 연습 - \[PCCE 기출문제\] 10번 / 공원
알고리즘 문제 연습 카카오톡 친구해요! 프로그래머스 교육 카카오 채널을 만들었어요. 여기를 눌러, 친구 추가를 해주세요. 신규 교육 과정 소식은 물론 다양한 이벤트 소식을 가장 먼저 알려드립니다.
school.programmers.co.kr](https://school.programmers.co.kr/learn/courses/30/lessons/340198?language=python3)

javascript 코드 예제
                                    ✍️ 시도한 방법
- BFS로 이미 차지된 영역 / 차지 되지 않은 영역에 대해 탐색을 시도했다.
javascript 코드 예제
                                    from collections import deque

def solution(mats, park):
    answer = 0

    # map 에서 가장 큰 n x n 영역 찾기
    # 좌, 우로만 확장해서 찾기

    empty_max = -999
    row = len(park)
    col = len(park[0])
    print(row, col)
    visited = [[0 for j in range(col)] for x in range(row)]
    print(visited)

    dx = [0, 1, 1]
    dy = [1, 0, 1]

    for i in range(row):
        for j in range(col):
            print("loop i, j", i, j)
            point = park[i][j]
            print("point: ", point, i, j)
            if visited[i][j] == 1:
                print("loop skip i, j", i, j)
                continue

            if point != "-1":
                # check Area
                visited[i][j] = 1
                print("i, j", i,j )

                area_que = deque([(i,j)])
                while area_que:
                    x, y = area_que.popleft()

                    for m in range(3):
                        nx, ny = x + dx[m], y + dy[m]

                        if nx < 0 or ny < 0 or nx >= row or ny >= row:
                            continue

                        if park[nx][ny] == "-1" or park[nx][ny] != point:
                            # end Area
                            print("nx, ny is empty", nx, ny)
                            continue

                        if visited[nx][ny] == 1:
                            continue

                        print("nx, ny is added to que : ", nx, ny)
                        area_que.append((nx, ny))
                        visited[nx][ny] = 1
            else:
                # empty
                print("empty !"i, j)

                empty_que = deque([(i,j)])
                size = 1
                while empty_que:
                    x, y = deque.popleft()

                    for m in range(3):
                        nx, ny = x + dx[m], y + dy[m]

                        if nx < 0 or ny < 0 or nx >= row or ny >= col:
                            continue

                        if park[nx][ny] != "-1":

                            continue

                        if

    print(visited)
    return answer
  • 우선 구현에 너무 많은 시간이 소요되었다. - 여기까지 했는데 1시간 이상...
  • 이미 차지된 영역은 잘 찾아냄
  • 빈 영역에 대한 알고리즘은 너무 복잡하다.
  • 빈 point에서 →↘↓ 으로 탐색하여 정사각형이면 size를 확장시켜 나가는 방법

DP로 풀기

feat, gpt-o4-mini

javascript 코드 예제
                                    ✍️ DP를 정의하기
- dp[i][j]는 (i,j)를 우하단 모서리로 하는 최대 정사각형

🖌️ 초기값
i = 0, j = 0은 1x1 정사각형 밖에 만들 수 없다.

🖌️ 판단
- i,j가 가질 수 잇는 최대 정사각형의 크기는 min(dp[i-1][j], dp[i-1][j-1], dp[i][j-1]) + 1 값이다.

🤔 이건 풀이방법을 모르면 풀 수 없는 문제였다.

이미지

  • 이런 식으로 풀 수 있다.

​

javascript 코드 예제
                                    from collections import deque

def solution(mats, park):
    print(mats)
    R = len(park)
    C = len(park[0])
    matrix = [[1 if park[i][j] == "-1" else 0 for j in range(C)] for i in range(R)]
    dp = [[0]*C for _ in range(R)]
    max_len = 0

    # init set
    for r in range(R):
        dp[r][0] = matrix[r][0]

    for c in range(C):
        dp[0][c] = matrix[0][c]

    for i in range(1, R):
        for j in range(1, C):
            if matrix[i][j] == 0:
                dp[i][j] = 0
            else:
                dp[i][j] = min(
                  dp[i -1][j], dp[i -1][j -1], dp[i][j - 1]
                ) + 1

                max_len = max(max_len, dp[i][j])

    # adjust max_len
    answer = 0
    for mat in mats:
        if mat <= max_len:
            answer = max(mat, answer)

    return answer if answer != 0 else -1
  • 코드 길이가 굉장히 짧아졌다.
  • 풀이과정이 명확하면 코드가 매우 깔끔해진다.
  • ​