[백준] 14925번 목장 건설하기 (C++)

2025. 12. 22. 20:22·Algorithm
728x90

https://www.acmicpc.net/problem/14925

 

 

이 문제는 N X M 배열이 주어지고 각각의 요소는 0, 1, 2로 주어진다. 0으로된 가장 큰 목장을 정사각형으로 짓는 것이다.

 

이 문제는 https://www.acmicpc.net/problem/1915 문제와 유사하다.

 

가장 큰 정사각형을 만들기 위해서는 하나하나씩 일일히 크기를 만들어가며 탐색할 수 있지만 그렇게 되면 시간복잡도가 O(NM^NM)으로 굉장히 크기 때문에 최적화 할 수 있는 방법을 찾아야 한다.

 

먼저 정사각형이 될 수 있는 조건은 무조건 4변의 길이가 다 같아야 한다는 특징이 있다.

 

따라서 현재 칸에서 0인 경우 왼쪽 칸과 위칸 왼쪽 대각선 칸을 비교하여 정사각형을 만들 수 있는지 확인해야 한다.

 

dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1

 

이러한 점화식을 세울 수 있는데 이 점화식이 의미하는 것은 현재칸이 0인 경우 정사각형을 만들 수 있는데 왼쪽 칸과 위칸 대각선 왼쪽 칸을 비교하여 가장 작은 숫자를 가져와서 1을 더하는 것이다. 

 

가장 작은 숫자를 가져오는 이유는 정사각형이기 때문에 변의 길이중에서 가장 작은 칸을 가져와 정사각형을 만들어야 한다.

 

 

정답코드

 

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"

const int INF = 1e9;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int N, M;
int graph[1001][1001];
int dp[1001][1001];

void solve() {
    int answer = 0;
    for(int i = 1; i <= N; i++) {
        for(int j = 1; j <= M; j++) {
            if(graph[i][j] == 0) {
                dp[i][j] = min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]}) + 1;
                answer = max(dp[i][j], answer);
            }
        }
    }

    cout << answer;
}

void input() {
    cin >> N >> M;

    for(int i = 1; i <= N; i++) {
        for(int j = 1; j <= M; j++) {
            cin >> graph[i][j];
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
    solve();
}

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 1520번 내리막 길 (C++)  (0) 2025.12.24
[백준] 14595번 동방 프로젝트 (Large) (C++)  (0) 2025.12.23
[백준] 20303번 할로윈의 양아치 (C++)  (0) 2025.12.21
[백준] 1826번 연료 채우기 (C++)  (0) 2025.12.03
[백준] 2613번 숫자구슬 (C++)  (0) 2025.12.02
'Algorithm' 카테고리의 다른 글
  • [백준] 1520번 내리막 길 (C++)
  • [백준] 14595번 동방 프로젝트 (Large) (C++)
  • [백준] 20303번 할로윈의 양아치 (C++)
  • [백준] 1826번 연료 채우기 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (279) N
      • Programming (47)
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (3)
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (1)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6) N
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩
    재귀
    우선순위큐
    우선순위 큐
    c언어
    이분탐색
    브루트포스
    투포인터
    시뮬레이션
    백준
    WebSecurity
    트리
    그리디
    구현
    Leviathan
    백트래킹
    그래프 이론
    DFS
    깊이우선탐색
    정렬
    다이나믹 프로그래밍
    linux
    BFS
    DP
    다익스트라
    누적합
    wargame
    에라토스테네스의 체
    Bandit
    비트마스킹
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 14925번 목장 건설하기 (C++)
상단으로

티스토리툴바