
15925번: 욱제는 정치쟁이야!!
문제
https://www.acmicpc.net/problem/15925
15925번: 욱제는 정치쟁이야!!
첫째 줄에 각 줄의 컴퓨터 개수 N과 이후의 컴퓨터실 사용 여부가 하나의 공백을 사이에 두고 주어진다. 사용 여부는 사용시 1, 미사용시 0으로 주어진다. (1 ≤ N ≤ 31, N % 2 == 1) 이후 둘째 줄부터
www.acmicpc.net
풀이
브루트포스 문제로 O(N^2)으로 해결가능합니다. 사용 여부를 x라고 할 때, 한 행 또는 열에서 x가 N/2개 이상이면 모두 x로 바꿉니다.
문제의 예제 입력 1을 예로 들어 설명해보겠습니다.
5 0
0 0 0 1 1
1 1 0 1 1
0 1 0 0 0
0 1 1 1 0
1 0 1 1 1
일 때, 행부터 먼저 모두 살펴보면 1행, 3행은 모두 0으로 바뀝니다.
0 0 0 0 0
1 1 0 1 1
0 0 0 0 0
0 1 1 1 0
1 0 1 1 1
이제 열을 한 번 살펴봅시다. 1열, 2열, 3열, 5열이 모두 0으로 바뀝니다.
0 0 0 0 0
0 0 0 1 0
0 0 0 0 0
0 0 0 1 0
0 0 0 1 0
다시 한 번 행을 살펴보면 2행, 4행, 5행이 모두 0으로 바뀝니다. 그리고 모든 원소가 의도한대로 0이 되었으므로 1을 출력합니다.
요약해보면, 모든 행을 살펴봤을 때 바꿀 수 있는 행들은 모두 먼저 바꿔줍니다.
그 다음에 모든 열을 살펴보며 바꿀 수 있는 열들을 모두 바꿔줍니다.
이제 다시 한 번 모든 행을 살피면, 스스로 바뀔 수 없었던 행들이 바뀐 열들로 인해 바뀔 수 있게 됩니다.
즉, 행-열-행 순으로 살펴보면 행의 값을 결정할 수 있습니다. 반대로 열-행-열 순으로 살펴보면 열의 값을 결정할 수 있습니다.
따라서 행-열-행-열 순으로 살펴보면 답을 구할 수 있습니다.
코드
#include <bits/stdc++.h>
using namespace std;
int main() {
cin.tie(0)->sync_with_stdio(0);
int n, x;
cin >> n >> x;
int arr[32][32];
// 행렬 입력
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> arr[i][j];
// 2번
for (int k = 0; k < 2; k++)
for (int i = 1; i <= n; i++) {
// 행 탐색
int cnt = 0;
for (int j = 1; j <= n; j++)
if (arr[i][j] == x)
cnt++;
if (cnt > n / 2)
for (int j = 1; j <= n; j++)
arr[i][j] = x;
// 열 탐색
cnt = 0;
for (int j = 1; j <= n; j++)
if (arr[j][i] == x)
cnt++;
if (cnt > n / 2)
for (int j = 1; j <= n; j++)
arr[j][i] = x;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
// 하나라도 의도한대로 바꾸지 못한 경우
if (arr[i][j] != x) {
cout << 0;
return 0;
}
// 이외의 경우
cout << 1;
return 0;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 20206 푸앙이가 길을 건너간 이유 (69) | 2023.09.30 |
---|---|
[백준 / BOJ] C++ 14715 전생했더니 슬라임 연구자였던 건에 대하여 (Easy) (67) | 2023.09.29 |
[백준 / BOJ] C++ 24265 알고리즘 수업 - 알고리즘의 수행 시간 4 (2) | 2023.09.14 |
[백준 / BOJ] C++ 24264 알고리즘 수업 - 알고리즘의 수행 시간 3 (1) | 2023.09.14 |
[백준 / BOJ] C++ 24263 알고리즘 수업 - 알고리즘의 수행 시간 2 (1) | 2023.09.14 |