-
[1285] 동전 뒤집기BOJ 2021. 10. 28. 11:38
https://www.acmicpc.net/problem/1285
1285번: 동전 뒤집기
첫째 줄에 20이하의 자연수 N이 주어진다. 둘째 줄부터 N줄에 걸쳐 N개씩 동전들의 초기 상태가 주어진다. 각 줄에는 한 행에 놓인 N개의 동전의 상태가 왼쪽부터 차례대로 주어지는데, 앞면이 위
www.acmicpc.net
<문제>
행에대해 브루트포스, 열에대해 그리디를 적용한다.
브루트포스는 (1<<n)-1번 반복하고, 그리디는 해당 열에 포함된 'H'와 'T'의 개수중 작은걸 고른다.
1열부터 순차적으로 탐색한다면, 각각의 열에대해 뒤집는 연산을 했는지는 완전히 독립적이므로
단순히 해당열중 작은걸 고른다는 접근이 정당하다.
1<<20이 거의 100만이므로, 행과 열 모두에 브루트포스를 적용할수는 없다. (100만*100만 > 6e8)
연산횟수는 2^N*N^2정도이므로 최종적으로 O(2^N)
<소스코드>
123456789101112131415161718192021222324252627282930313233343536373839#include <bits/stdc++.h>using namespace std;int n, a[22][22], clone[22][22];void toggleY(int sy) {for (int i = 0; i < n; i++) a[sy][i] = 1 - a[sy][i];}int countAnswer(void) {int ret = 0;for (int i = 0; i < n; i++) {int temp = 0;for (int j = 0; j < n; j++) temp += a[j][i];ret += (min(temp, n - temp));}return ret;}int main(void) {cin >> n;int i, j;for (i = 0; i < n; i++) {string s;cin >> s;for (j = 0; j < n; j++) {if (s[j] == 'T') a[i][j] = 1;clone[i][j] = a[i][j];}}const int BIT = (1 << n) - 1;int ans = 54321;for (int bty = 0; bty <= BIT; bty++) {for (i = 0; i < n; i++)for (j = 0; j < n; j++) a[i][j] = clone[i][j];for (i = 0; i < n; i++)if (bty & (1 << i)) toggleY(i);int ret = countAnswer();ans = min(ret, ans);}cout << ans;return 0;}cs 'BOJ' 카테고리의 다른 글
[15989] 1, 2, 3 더하기 4 (0) 2021.10.31 [23058] 뒤집기 게임 (0) 2021.10.31 [1562] 계단 수 (0) 2021.10.27 [1102] 발전소 (0) 2021.10.27 [3056] 007 (0) 2021.10.27