집합의 표현
집합을 표현하는 여러가지 방법 중에 비트를 이용하는 방법이 있다.
만약 64비트 정수를 쓴다면 원소의 개수가 64개보다 작은 집합을 나타낼 수 있다.
집합을 아래와 같이 비트로 표현할 수 있다.
{1, 2, 3, 4, 5} -> 11111
{2, 3, 4, 5} -> 11110
{1, 3, 5} -> 10101
i 번째 비트만 1로 바꾸기 - or 연산
set = set | (1 << (i -1));
ex) i = 2 일때, 0000 | (1 << 1 ) -> 0000 | 0010 -> 0010
i 번째 비트만 0로 바꾸기 - and 연산
set = set & ~(1 << (i -1));
ex) i = 2 일때, 1111 & (1 << 1 ) -> 1111 & ~0010 -> 1111 & 1101 -> 1101
i 번째 비트만 뒤집기 - xor 연산
set = set ^ (1 << (i -1));
ex) i = 2 일때, 1111 ^ (1 << 1 ) -> 1111 ^ 0010 -> 1101
i 번째 비트가 1인지 0인지 확인
set & 1 << (i - 1);
ex) 1100 & (1 << 2) -> 1100 & 0100 -> 0100 -> 결과값 != 0 -> i번째 비트가 1
i번째 비트만 0으로 만들기
set = set & ~(1 << (i - 1))
ex) 11011 & ~(1 << 3) = 11011 & ~(01000) = 11011 & 10111 = 10011
0 ~ n-1번 비트까지 모두 1인지 확인
set == (1 << n) - 1
ex) n이 4라면 1 << 4 = 10000이고 10000 - 00001은 01111이다.
비트 마스킹을 사용하는 문제
백준[11723] 집합
풀이 집합을 아래와 같이 비트로 표현 할 수 있다. {1, 2, 3, 4, 5} -> 11111 {2, 3, 4, 5} -> 11110 {1, 3, 5} -> 10101 i 번째 비트만 1로 바꾸기 == or 연산 set = set | (1 << (i -1)); ex) i = 2 일때, 0000..
mangu.tistory.com
백준[2098] 외판원 순회
문제 링크 http://icpc.me/2098 2098번: 외판원 순회 첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 16) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없
mangu.tistory.com
백준 [1311] 할 일 정하기 1
풀이 dp[현재 사람][이전까지 수행한 일의 상태] = 현재 일의 상태까지의 최솟값 이 문제는 비트마스크와 dp를 이용하여 풀이할 수 있다. 이전까지 수행한 일의 상태를 0011 -> 1, 2번이 일을 한 상태
mangu.tistory.com
'Algorithm > 개념' 카테고리의 다른 글
| 다시 보려고 모은 알고리즘 개념 링크 (0) | 2021.10.30 |
|---|---|
| 좌표 압축 (0) | 2021.09.25 |