※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 20011번 문제인 Рекламный щит이다.
문제는 아래 링크를 확인하자.

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

 

어떤 두 전구가 같은 그룹에 속한다는 것과 모든 K개의 그림문자에서 두 전구의 상태가 같아야 함은 동치임을 이용하자.

 

이를 이용하면, K개의 문자에서의 전구의 상태가 몇 가지 존재하는지 계수하는 것으로 문제를 해결할 수 있다.

 

특히 이 문제에서는 K가 100 이하이고 전구의 상태는 0과 1 두가지 뿐이므로, 128비트 정수 자료형을 이용해 상태를 비트마스킹하여 각 전구를 표현할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <set>
using namespace std;
typedef __int128 lll;

int K, R, C;
lll A[100][100];
set<lll> st;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> K >> R >> C;
	for (lll k = 0, b = 1; k < K; k++, b <<= 1) {
		for (int r = 0; r < R; r++) {
			for (int c = 0; c < C; c++) {
				char x; cin >> x;
				if (x == '*') A[r][c] |= b;
			}
		}
	}

	for (int r = 0; r < R; r++) {
		for (int c = 0; c < C; c++) {
			st.insert(A[r][c]);
		}
	}

	cout << st.size();
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 23649 // C++] Alice and Path  (2) 2024.09.23
[BOJ 32315 // C++] Cool Phone Numbers  (0) 2024.09.20
[BOJ 10291 // C++] Ribbon  (1) 2024.09.15
[BOJ 16551 // C++] Potato Sacks  (1) 2024.09.14
[BOJ 9997 // C++] 폰트  (2) 2024.09.13

+ Recent posts