음준희 블로그

백준 1034 : 램프 c++ 본문

알고리즘/백준

백준 1034 : 램프 c++

joonhee305 2022. 12. 17. 19:47

https://www.acmicpc.net/problem/1034

 

1034번: 램프

첫째 줄에 N과 M이 주어진다. N은 행의 개수이고, M은 열의 개수이다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 램프의 상태가 주어진다. 1이 켜져있는 상태이고, 0이 꺼져

www.acmicpc.net

설명
1. 동시에 행에 불이 들어올 조건은 행의 패턴이 동일해야한다.
ex) 1011 과 1001은 절대로 같이 켜질수가 없음
2. 해당 패턴의 0의개수보다 k가 작으면 절대로 해당 패턴에서는 불을 킬 수 없다.
3. 불을 키고 남은 횟수가 홀수라면 하나의 열은 반드시 불이 꺼지게 되므로 불을 킬 수 없게 된다.

 

m이 50까지 이므로 패턴을 2^50미만의 수로 나타낼 수 있다. => long long으로 표현 가능
map을 이용해 패턴의 개수를 구하고 해당 패턴의 0의 개수로 행에 불을 킬 수 있는지를 판별하고 킬 수 있다면 최대값을 갱신한다.

 

#include<bits/stdc++.h>
#include<time.h>


#define MAX 1000000007
#define INF 2000000000
#define MOD 1000000007 
using namespace std;
typedef long long ll;
typedef pair<int, int > pii;
typedef pair<long long, long long> pll;
typedef pair<double, double> pdd;

int dx[8] = { 0, 0, 1, -1, 1, 1, -1, -1 };
int dy[8] = { 1, -1, 0, 0, -1, 1, 1, -1 };

/*
int dx[2][6] = {
    {1, -1, 0, 0 ,1, -1},
    {1, -1, 0, 0, -1, 1}
};
int dy[2][6] = {
    {0, 0, 1, -1 ,1, -1},
    {0, 0, 1, -1, 1, -1}
};*/

//int dx[8] = { -1, -1, 1, 1, -2, -2, 2, 2 };
//int dy[8] = { 2, -2, 2, -2, -1, 1, -1, 1 };

void init() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
}
ll gcd(ll a, ll b) { for (; b; a %= b, swap(a, b)); return a; }
ll lcm(ll a, ll b) { return (a * b) / gcd(a, b); }


int main() {
    init();
    int n, m; cin >> n >> m;
    map<ll, int> pattern;

    for (int i = 0; i < n; i++) {
        string s; cin >> s;
        ll num = 0;
        ll cnt = 0;
        for (int i = 0; i < m; i++) {
            num *= 2;
            if (s[i] == '1') 
                num += 1;
        }
        pattern[num]++;
    }
    int k; cin >> k;
    int ans = 0;
    for (auto iter = pattern.begin(); iter != pattern.end(); iter++) {
        ll num = iter->first;
        int cnt = 0;
        for (ll i = 0; i < m; i++) {
            if (!(num & 1ll << i))
                cnt++;
        }
        if (k >= cnt && (k - cnt) % 2 == 0) {
            ans = max(ans, iter->second);
        }
    }
    cout << ans << "\n";

}

'알고리즘 > 백준' 카테고리의 다른 글

백준 6137 : 문자열 생성  (0) 2022.12.30
백준 2014 : 소수의 곱 c++  (0) 2022.12.29
백준 1028 : 다이아몬드 광산  (0) 2022.12.15
백준 2933 : 미네랄 c++  (0) 2022.12.14
백준 8916 : 이진 검색 트리 c++  (1) 2022.12.12