Lv 2. 가장 큰 정사각형

2024. 9. 6. 23:23·Algorithm & Data Structures/Programers

 

오늘은 별첨으로 다른코드도 있다.
DP라는 다이나믹프로그래밍이 가로 ,세로 나눌것이아니라 한꺼번에 해도 된다는 생각을 왜 못했을까
시간이 너무오래걸렸다. 간단히 짤수 있는 코드임에도 불구하고..

주석은 내가 고민한 흔적이며
첫 코드는 DP로 가로 세로 이차원배열을 만들어  대각선 루프를 돌며 비교한것이고
두번째 코드는 가로 세로 대각선을 한꺼번에 비교한 코드이다.

당연히 두번째코드가 3배정도 훨씬 더 빠르다.
조금더 고민해보자..항상 생각하고 보다 쉽게 효율적이게 간단하게 짤수 있게 노력하자.

// 가장 큰 정사각형 찾기
// 가장 큰 정사각형을 찾는다라...
// 1 1 0 0 1 
// 1 0 1 1 1
// 0 0 1 1 1 
// 0 1 1 1 1
// 0 1 1 1 1 
// 1000 * 1000 = 1.000.000  백만인데.. 백만칸을 싹다 돌면서한다..? 미친짓

// DP?  
// 1 2 0 0 1
// 1 0 1 2 3
// 0 1 2 3 4
// 1 2 0 1 2 
// 0 1 2 3 4
// 0 1 2 3 4

// 세로로 DP   // 가로로 DP   //대각선 DP 실제 구현해서 +1 하면서 하기 
// 1 1 0 0 1  // 1 2 0 0 1
// 2 0 1 1 2  // 1 0 1 2 3
// 0 0 2 2 3  // 0 1 2 3 4
// 1 1 3 3 4  // 1 2 3 4 5
// 0 2 4 4 5  // 0 1 2 3 4
// 0 3 5 5 6  // 0 1 2 3 4 

// 1 2 3 4 5 6 7 8
// 1 2 3 0 4 5 6 7
// 1 2 3 4 5 0 1 2
// 1 0 1 2 3 4 5 0
// 1 2 3 4 5 6 0 1
// 1 2 3 4 5 6 7 8
// 1 0 1 2 3 4 5 6
// 1 2 3 4 5 6 7 8

// 1 1 1 1 1 1 1 1
// 2 2 2 0 2 2 2 2
// 3 3 3 1 3 0 1 2
// 4 0 4 2 4 1 2 0
// 5 1 5 3 5 2 0 1
// 6 2 6 4 6 3 1 2
// 7 0 7 5 7 4 2 3
// 8 1 8 6 8 5 3 4
// 요고네 요거 

// Max 최신화 max 보다 낮은거 확인 ㄴㄴ 
// max 보다 높은데 내리면서 낮추다가 max보다 낮으면 확인 ㄴㄴ

// 백만칸 다돌면서 dp[][] 배열 생성

// 앞에서 뒤로 하는게 편하긴한데 글케하자.
// 백만칸중에 확인 안하는거 다수
// 확인하더라도 한줄만 확인 쭉하면된다.


import java.util.*;

class Solution
{
    int[][] dp1,dp2;
    int max = Integer.MIN_VALUE;
    
    //dp array create method
    //가로 dp1 세로 dp2 배열 생성
    public void createDp(int x, int y, int[][] board){
        int dsum = 0 , psum = 0; //가로 dsum 세로 psum
        for(int i = 0 ; i < x ; i++){
            for(int j = 0 ; j < y ; j++){
                if(board[i][j] == 0)
                    dsum = 0;
                else
                    dsum++;
                dp1[i][j] = dsum;
            }
        }
        for(int i = 0 ; i < y ; i++){
            for(int j = 0 ; j < x ; j++){
                if(board[j][i] == 0)
                    psum = 0;
                else
                    psum++;
                dp2[j][i] = psum;
            }
        }
    }
    // DP check method
    // 대각선 체크 
    public void dpCheck(int x, int y, int[][] board){
        int sum = 1;
        for (int k = 0; k < x + y - 1; k++) {
            int iStart = (k < y) ? 0 : k - y + 1;
            int jStart = (k < y) ? k : y - 1;

            int i = iStart;
            int j = jStart;

            // 대각선 순회
            while (i < x && j >= 0) {
                if(board[i][j] == 0){ //0이면 continue;
                    sum = 0;
                    continue;
                }
                else{
                    if(i - 1 >= 0 && j - 1 >= 0){ //범위 안일때
                        if(sum <= dp1[i][j-1] && sum <= dp2[i-1][j])
                            sum++;
                        else
                            sum = Math.max(dp1[i][j-1],dp2[i-1][j]);
                    }
                }
                max = max < sum ? sum : max; //max 최신화
                i++;
                j--;
            }
        }
    }
    
    public int solution(int [][]board)
    {
        int x = board.length;
        int y = board[0].length;
        dp1 = new int[x][y];
        dp2 = new int[x][y];
        createDp(x,y,board);
        dpCheck(x,y,board);
        return max*max;
    }
}
import java.util.*;

class Solution {
    public int solution(int [][]board) {
        int n = board.length;
        int m = board[0].length;
        
        int[][] dp = new int[n][m];
        int maxSquareLength = 0;

        // DP 배열 초기화 및 정사각형 계산
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (board[i][j] == 1) {
                    // 경계선에 있는 경우에는 자기 자신이 정사각형의 한 변 길이
                    if (i == 0 || j == 0) {
                        dp[i][j] = board[i][j];
                    } else {
                        // 상단, 좌측, 대각선 상단-좌측 값을 참조
                        dp[i][j] = Math.min(dp[i-1][j], Math.min(dp[i][j-1], dp[i-1][j-1])) + 1;
                    }
                    // 가장 큰 정사각형의 한 변의 길이 갱신
                    maxSquareLength = Math.max(maxSquareLength, dp[i][j]);
                }
            }
        }

        // 가장 큰 정사각형의 면적 반환
        return maxSquareLength * maxSquareLength;
    }
}

'Algorithm & Data Structures > Programers' 카테고리의 다른 글

Lv 2. 문자열 압축  (0) 2024.09.09
Lv 2. 멀쩡한 사각형  (2) 2024.09.08
Lv 2. 거리두기 확인하기  (0) 2024.09.05
Lv 2. 리코쳇 로봇  (0) 2024.09.04
Lv 2. 테이블 해시 함수  (0) 2024.09.03
'Algorithm & Data Structures/Programers' 카테고리의 다른 글
  • Lv 2. 문자열 압축
  • Lv 2. 멀쩡한 사각형
  • Lv 2. 거리두기 확인하기
  • Lv 2. 리코쳇 로봇
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    오늘
    어제
    • 분류 전체보기 (326)
      • Algorithm & Data Structures (246)
        • BOJ (104)
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (27)
        • SQL (21)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • 네트워크 (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    Union-Find
    스택
    dp
    백트래킹
    unionfind
    골드
    유니온파인드
    이분탐색
    DynamicProgramming
    백준
    PriorityQueue
    프로그래머스
    Stack
    동적계획법
    다익스트라
    programmers
    BFS
    algorithm
    SQL
    Java
    경로압축
    baekjoon
    후위순회
    투포인터
    전위순회
    dfs
    Dijkstra
    binarySearch
    알고리즘
    구현
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Geisha
Lv 2. 가장 큰 정사각형
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.