가장 큰 정사각형

2023. 2. 10. 16:10·BackEnd/알고리즘 공부

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

 

1915번: 가장 큰 정사각형

첫째 줄에 n, m(1 ≤ n, m ≤ 1,000)이 주어진다. 다음 n개의 줄에는 m개의 숫자로 배열이 주어진다.

www.acmicpc.net

문제 설명

2차원 배열을 알려 주면 칸에 숫자가 1인 제일큰 정사각형의 넓이를 찾으면 된다.

 

문제에 대한 이이디어

이런 문제들은 점화식을 잘 찾아서 사용해야 한다. 그래서 더 어려운 것 같다.

정사각형의 넓이를 찾아라를 쉽게 말하면 정사각형이 될 수 있는 한 변의 최대 길이를 찾아라 라고 할 수 있다.

 

어떻게 정사각형의 한 변의 길이를 찾을 수 있을까? 

정사각형의 조건은 가로 세로의 길이가 같고 또 모든 인접한 면이 1이어야 한다.

  • 지금 자신이 1이라면
  • 왼쪽 대각선 위, 바로 위, 왼쪽이 모두 1일경우 정사각형을 만들 수 있다.
  • 각 3개의 방향에서 최솟값을 찾는다.
  • 지금 자신의 숫자를 더해준다.

지금 3,3 지점에 1이 들어와야 할 차례이다. 

화살표 방향으로 검사해 그 중 최솟값을 찾는다. 여기서는 최솟값이 1이다. 최솟값에 지금 자신의 값(1)을 더한다.

 이렇게 변하고 지금 만들 수 있는 정사각형의 한 변의 크기는 최대 2이다.

 

구현

import java.io.IOException;
import java.util.Scanner;


public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        long pro[][] = new long[n][m];
        long max =0;
        for (int i = 0; i < n; i++) {
            String str = sc.next();
            for (int j = 0; j < m; j++) {
                pro[i][j] = Long.parseLong(String.valueOf(str.charAt(j)));
                if(pro[i][j] == 1 && i > 0 && j > 0){
                    pro[i][j] = Math.min(pro[i-1][j-1], Math.min(pro[i-1][j], pro[i][j-1])) + pro[i][j];
                }
                max = Math.max(pro[i][j], max);
            }
        }
        System.out.println(max * max);
    }
}

DP는 맨날 코드는 짧지만 생각하기가 어렵다 ㅜㅜ

 

 

https://github.com/Heron-Woong/CodingTest_Practice/commit/3c0ba9c3bfc50d3e441837ffa2f1fb9549ea6367

 

백준_1915, 가장 큰 정사각형 · Heron-Woong/CodingTest_Practice@3c0ba9c

Showing 1 changed file with 24 additions and 0 deletions.

github.com

 

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

욕심쟁이 판다(백준_1937)  (0) 2023.02.14
외판원 순회(백준_2098)  (0) 2023.02.13
조합과 순열 구현해보기  (0) 2023.02.09
공통 부분 문자열(백준_5582)  (0) 2023.02.07
사전(백준_1256)  (0) 2023.02.06
'BackEnd/알고리즘 공부' 카테고리의 다른 글
  • 욕심쟁이 판다(백준_1937)
  • 외판원 순회(백준_2098)
  • 조합과 순열 구현해보기
  • 공통 부분 문자열(백준_5582)
인프라 감자
인프라 감자
  • 인프라 감자
    삶은 인프라
    인프라 감자
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • 클라우드&인프라 (28)
        • 인프라 공부 (4)
        • AWS 구조와 서비스 (18)
        • 클라우드 공부 (4)
        • Terraform (2)
      • AWS Cloud School (13)
        • project (5)
        • Linux, Network (6)
        • Docker (2)
      • BackEnd (162)
        • JAVA 공부 (15)
        • 알고리즘 공부 (71)
        • MySQL 문제 풀기 (8)
        • 스프링 핵심 원리 - 기본편 (18)
        • 스프링 MVC 1편 (4)
        • 자바 ORM 표준 JPA 프로그래밍 (21)
        • 실전! 스프링 부트와 JPA 활용1 (8)
        • 실전! 스프링 부트와 JPA 활용2 (5)
        • 스프링 데이터 JPA (8)
        • Querydsl (4)
      • 혼자하는 프로젝트 (32)
        • 배달의 민족 클론코딩 (7)
        • 나만의 프로젝트 (10)
        • 스프링 부트로 구현한 웹 (15)
  • 블로그 메뉴

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

    • Email
    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    이것이 자바다
    쿼드 압축
    백트래킹
    상속
    디팬스 게임
    유니온 파인드
    dp
    중첩 선언
    네트워크 기본 용어
    스프링 핵심 원리-기본편
    완전탐색
    자동 배포
    자바
    정렬
    querydsl
    VPN
    linux
    조합
    다이나믹 프로그래밍
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
인프라 감자
가장 큰 정사각형
상단으로

티스토리툴바