
안녕하세요 뚜디 입니다 :)
코딩테스트 연습 - 가장 큰 정사각형 찾기 | 프로그래머스 (programmers.co.kr)
코딩테스트 연습 - 가장 큰 정사각형 찾기
[[0,1,1,1],[1,1,1,1],[1,1,1,1],[0,0,1,0]] 9
programmers.co.kr
< 프로그래머스 - 가장 큰 정사각형 찾기 (LV2) >
1. 연습 문제
2. 문제 풀이
3. 소스 코드
4. 결과
이번 문제 같은 경우 알고리즘 문제 풀이에서 가장 자주 등자하는
DP(Dynamic Programming) 알고리즘 입니다.
아래 해당 포스팅을 참고해서 DP 관련하여 숙지하고오세요~
[C++] 동적 계획법 Dynamic Programming(DP) 사용법 (tistory.com)
[C++] 동적 계획법 Dynamic Programming(DP) 사용법
안녕하세요 뚜디 입니다:) < 동적 계획법 Dynamic Programming (DP) > 1. 동적 계획법이란? 2. 동적 계획법 사용 3. 동적 계획법 예시 1. 동적 계획법이란? 다이나믹 프로그래밍(Dynamic Programmin)은 프로그래..
sindh718.tistory.com
[C++] 프로그래머스 :: 땅따먹기 (tistory.com)
[C++] 프로그래머스 :: 땅따먹기
안녕하세요 뚜디 입니다 :) 코딩테스트 연습 - 땅따먹기 | 프로그래머스 (programmers.co.kr) 코딩테스트 연습 - 땅따먹기 땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(land)은 총 N행 4열로 이루
sindh718.tistory.com
1. 연습 문제
※ 문제 설명
1와 0로 채워진 표(board)가 있습니다. 표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다. 표에서 1로 이루어진 가장 큰 정사각형을 찾아 넓이를 return 하는 solution 함수를 완성해 주세요. (단, 정사각형이란 축에 평행한 정사각형을 말합니다.)
예를 들어
1 | 2 | 3 | 4 |
0 | 1 | 1 | 1 |
1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 |
0 | 0 | 1 | 0 |
가 있다면, 가장큰 정사각형의 넓이는 9가 된다.
※ 제한 조건
표(board)는 2차원 배열로 주어집니다.
표(board)의 행(row)의 크기 : 1,000 이하의 자연수
표(board)의 열(column)의 크기 : 1,000 이하의 자연수
표(board)의 값은 1또는 0으로만 이루어져 있습니다.
※ 입출력 예
board | answer |
[[0,1,1,1],[1,1,1,1],[1,1,1,1],[0,0,1,0]] | 9 |
[[0,0,1,1],[1,1,1,1]] | 4 |
2. 문제 풀이
DP(Dynamic Programing) 알고리즘을 이용하여 해결해야한다.
1. vector dp를 입력되는 벡터 board와 같게 초기화를 진행한다.
2. answer = board[0][0]을 통해 최소값을 입력해준다.
=> 입력된 벡터의 크기가 작을경우, 최소값을 확인하기위한 용도
3. 반복문을 통해 1,1 부터 진행한다.
=> 주변 정사각형의 유무를 찾기 위해
4. #include <algorithm>의 min()함수를 이용한다
=> "min(5,3) : 3" 최소값을 찾아주는 함수 / "min({5,8,2}) : 2"
3. 소스 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<vector<int>> board)
{
int answer;
vector<vector<int>> dp(board.size(), vector<int>(board[0].size(), 0));
for (int i = 0; i < board.size(); i++) {
for (int j = 0; j < board[0].size(); j++) {
dp[i][j] = board[i][j];
}
}
answer = board[0][0];
for (int i = 1; i < board.size(); i++) {
for (int j = 1; j < board[0].size(); j++) {
if (board[i][j] == 1) {
dp[i][j] = min({ dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1] }) + 1;
if (answer < dp[i][j]) {
answer = dp[i][j];
}
}
}
}
return answer*answer;
}
4. 결과

'Programmers > C++' 카테고리의 다른 글
[C++] 프로그래머스 :: n^2 배열 자르기 (0) | 2021.10.31 |
---|---|
[C++] 프로그래머스 :: 쿼드압축 후 개수 세기 (0) | 2021.10.28 |
[C++] 프로그래머스 :: 올바른 괄호 (0) | 2021.10.27 |
[C++] 프로그래머스 :: 다음 큰 숫자 (0) | 2021.10.21 |
[C++] 프로그래머스 :: 땅따먹기 (0) | 2021.10.17 |