Bleeding edge

[프로그래머스] 가장 큰 정사각형 - 자바스크립트 본문

코딩테스트 공부

[프로그래머스] 가장 큰 정사각형 - 자바스크립트

codevil 2022. 5. 30. 23:02

https://programmers.co.kr/learn/courses/30/lessons/12905#

 

코딩테스트 연습 - 가장 큰 정사각형 찾기

[[0,1,1,1],[1,1,1,1],[1,1,1,1],[0,0,1,0]] 9

programmers.co.kr

문제 플로우는 간단하지만 Boundary Condition이 조금더 귀찮은 문제이다.

문제의 플로우는 다음과 같다.

1. board의 1, 1에서 시작하여 n, n까지 for문 두개를 순회한다.i, j

2. board[i][j]의 [i-1, j-1], [i, j-1], [i-1,j-1], [i,j]모두 0이 아닌경우, [i,j]를 제외한 숫자에서 가장 작은 숫자에 +1을 더한다

3. 이 과정중 가장 큰숫자를 제곱한다.

이 순서대로 가지만 이 문제에는 여러 Boundary Condition이 존재한다

1. i가 최대0인경우, j가 최대 0인경우 이경우에는, 각 경우에서 가장 큰 숫자가 return 되야한다. 이유는, 0아니면 1만 나올 수 있기 때문이다.

2. for문에서 제외해준, 0,0 1,0 0,1을 제외하고 모두 0이나온 경우이다. 이 경우에, zeroCheck라는 변수를 만들어서, 이 숫자보다 작은 값으로 return이 될꺼 같으면 그 값을 올려주게 Boundary Condition을 넣으면 된다.

 

function solution(board){
    const h = board.length
    const w = board[0].length
    //boundary condition
    if(h===1){return Math.max(...board[0])}
    if(w===1){
        let wmax
        for(let i=0;i<w;i++){
            if(wmax<board[i]){
                wmax = board[i]
            }
        } return wmax}
    // calc
    let max =0
    let zeroCheck = Math.max(board[0][0], board[1][0], board[0][1])
    for(let j=1;j<w;j++){
        for(let i=1;i<h;i++){
            if(board[i-1][j-1]!==0&&board[i-1][j]!==0&&board[i][j-1]!==0&&board[i][j]!==0){
                board[i][j]=Math.min(board[i-1][j-1], board[i-1][j], board[i][j-1])+1
                if(max<board[i][j]){
                    max = board[i][j]
                }
            }
        }
    }
    max = Math.max(max, zeroCheck)
    return max*max
}