반응형
https://www.acmicpc.net/problem/15925
#문제 간단 정리
구현 + 브루트 포스 문제
#문제 해결 방법
우선 브루트포스로 문제를 풀리게하도록 고심한 흔적이 여럿 보이는데
문제의 n 이 31 까지로 상당히 작고
보드가 홀수로만 주어진다는 점이 주목할만한 점인데
만약 행이나 열을 1 이나 0으로 바꾸게 되면
항상 1이나 0이 늘어나기 때문에 다음에 더 유리한 조건이 된다
때문에 행과 열을 반복해서 교차로 키거나 끌 수 있는지 확인해주면 (N^2)
한번 키거나 끌 때 N개의 컴퓨터가 바뀌니까 이 작업이 최대 N 번복
N^2 * N 해서 대략 N^3 정도인 듯 하다
나머지는 개인의 구현 역량에 따라 구현하면 된다.
#전체 코드
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int n;
int isUse;
vector<vector<int>> board;
bool checkRow() {
bool check = false;
for (int i = 0; i < n; i++) {
int count = 0;
for (int j = 0; j < n; j++) {
if (board[i][j] == isUse) count++;
}
if (count > n / 2 && count != n) {
for (int j = 0; j < n; j++) {
board[i][j] = isUse;
}
check = true;
}
}
return check;
}
bool checkCol() {
bool check = false;
for (int i = 0; i < n; i++) {
int count = 0;
for (int j = 0; j < n; j++) {
if (board[j][i] == isUse) count++;
}
if (count > n / 2 && count !=n) {
for (int j = 0; j < n; j++) {
board[j][i] = isUse;
}
check = true;
}
}
return check;
}
bool isConfirm() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] != isUse) return false;
}
}
return true;
}
bool isPossible() {
while (true) {
if (!checkRow() && !checkCol()) {
if (isConfirm()) {
return true;
}else return false;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
cin >> isUse;
board.resize(n, vector<int>(n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> board[i][j];
}
}
if (isPossible()) {
cout << 1 << endl;
}
else cout << 0 << endl;
return 0;
}
반응형
'[백준] > C++' 카테고리의 다른 글
백준 21738번 얼음깨기 펭귄 [C++] (0) | 2025.01.15 |
---|---|
백준 2563번 색종이 [C++] (0) | 2025.01.12 |
백준 17088번 등차수열 변환 [C++] (0) | 2025.01.10 |
백준 30023번 전구 상태 바꾸기 [C++] (0) | 2025.01.04 |
백준 14504번 로봇 청소기 [C++] (0) | 2025.01.02 |