0과 1로 이루어진 격자에서 1인 칸들이 빈칸 없는 직사각형 하나를 이루는지 검사해요. 가로 또는 세로 길이가 1이어도 직사각형이에요. 직사각형을 이루면 1인 칸 수를, 내부에 빈칸이 있으면 -1을 반환해요. 1인 칸이 없으면 0이에요.
int solution(vector<vector<int>> board)가 요구한 값을 반환하도록 빈칸을 채워 주세요.
매개변수와 반환값
행 수와 열 수는 각각 110이고 모든 행의 길이는 같아요. 값은 0 또는 1이에요. 반환값은 -1 또는 0100인 정수예요. edges의 반환 순서는 최소 행, 최대 행, 최소 열, 최대 열이에요.
예시
board={{0, 1, 1}, {0, 1, 1}}이면 4를 반환해요. 오른쪽 두 열이 빈칸 없는 2×2 직사각형이에요.
board={{1, 1}, {1, 0}}이면 -1를 반환해요. 2×2 경계 안의 오른쪽 아래가 비어 있어요.
실행용 입출력
첫 줄에 행 수 열 수, 이후 각 줄에 행 하나를 입력해요. main은 입력을 매개변수로 바꾸고 반환값을 출력하는 채점 하네스예요. 풀이 대상은 solution과 제공된 보조 함수의 빈칸이에요.
예시 입력
2 3
0 1 1
0 1 1
예상 결과
4
핵심 개념
array-2d: 행과 열의 위치를 구분해요.
function-design: 보조 함수의 인자와 반환 계약을 연결해요.
stl-vector: 벡터의 크기와 인덱스로 매개변수를 읽어요.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> edges(const vector<vector<int>>& board) {
int rows = (int)board.size(), cols = (int)board[0].size();
vector<int> result = {rows, -1, cols, -1};
for (int r = 0; r < rows; ++r) {
for (int c = 0; c < cols; ++c) {
if (board[r][c] == 0) continue;
result[0] = min(result[0], r);
result[1] = /*@blank1@*/;
result[2] = min(result[2], c);
result[3] = max(result[3], c);
}
}
return result;
}
int solution(vector<vector<int>> board) {
int count = 0;
for (const vector<int>& row : board)
for (int value : row) count += value;
if (count == 0) return 0;
vector<int> box = edges(board);
int height = box[1] - box[0] + 1;
int width = box[3] - box[2] + 1;
if (count == /*@blank2@*/) return count;
return -1;
}
int main() {
int rows, cols; cin >> rows >> cols;
vector<vector<int>> board(rows, vector<int>(cols));
for (int r = 0; r < rows; ++r)
for (int c = 0; c < cols; ++c) cin >> board[r][c];
cout << solution(board) << '\n';
return 0;
}