
개요
알고리즘 공부를 하면서 비트마스킹이라는 기법이 존재한다는 것을 알았고 자바를 통해서 비트를 어떤식으로 쓸 수 있는지 감을 좀 잡고 비트를 어떻게 사용하고 어떻게 쓸 수 있는지 알아보았다.
본론
비트 마스킹은 말그대로 비트를 사용한 연산들을 의미한다.
비트 연산은 low level 연산이기 때문에 기존의 연산들보다 속도가 높고 메모리 사용량도 훨씬 낮다.
집합 혹은 true/false 대신에 비트 마스킹을 사용할 수 있는 것으로 보이며 자바의 boolean 타입은 1Byte지만 사실 비트 연산으로 이것을 표현하면 1비트로 표현할 수 있다.
집합과 true false
비트 마스킹을 사용해서 집합을 표현할 수 있다.
// 공집합
int x = 0;
// x 집합에 y 추가 (y비트를 1로 세트한다.)
x |= (1 << y);
// x 집합에 y 제거 (y비트를 0으로 세트한다.)
x &= ~(1 << y);
// x 집합에 y가 존재하는지 체크
(x & (1 << y) == (1 << y))
// x 집합에 모든 원소를 채운다. (집합의 최대 크기가 y라고 가정)
x = (1 << y+1) -1;
위와 같이 비트를 통해서 boolean[]을 표현하거나 집합을 표현할 수 있다.
다음 포스트는 비트 마스킹을 이용해서 boolean[]을 대체한 결과를 테스트해본 포스트이다.
[JAVA] 백준 2961
2961번: 도영이가 만든 맛있는 음식 첫째 줄에 재료의 개수 N(1 ≤ N ≤ 10)이 주어진다. 다음 N개 줄에는 그 재료의 신맛과 쓴맛이 공백으로 구분되어 주어진다. 모든 재료를 사용해서 요리를 만들
g-db.tistory.com
다음 포스트는 비트 마스킹을 이용해서 집합을 표현한 문제이다.
[JAVA] 백준 15787
15787번: 기차가 어둠을 헤치고 은하수를 입력의 첫째 줄에 기차의 수 N(1 ≤ N ≤ 100000)과 명령의 수 M(1 ≤ M ≤ 100000)가 주어진다. 이후 두 번째 줄부터 M+1번째 줄까지 각 줄에 명령이 주어진다. www.
g-db.tistory.com
결론
비트 마스킹을 사용하면 boolean[]을 대체할 수 있고 집합을 표현할 때 속도와 메모리 효율을 높일 수 있다.
'알고리즘' 카테고리의 다른 글
[Algorithm] Next Permutation 알고리즘 (0) | 2024.04.16 |
---|---|
[Algorithm] 최소 공통 조상 LCA란? (0) | 2024.03.09 |
[Algorithm] 세그먼트 트리란? (0) | 2024.03.07 |

개요
알고리즘 공부를 하면서 비트마스킹이라는 기법이 존재한다는 것을 알았고 자바를 통해서 비트를 어떤식으로 쓸 수 있는지 감을 좀 잡고 비트를 어떻게 사용하고 어떻게 쓸 수 있는지 알아보았다.
본론
비트 마스킹은 말그대로 비트를 사용한 연산들을 의미한다.
비트 연산은 low level 연산이기 때문에 기존의 연산들보다 속도가 높고 메모리 사용량도 훨씬 낮다.
집합 혹은 true/false 대신에 비트 마스킹을 사용할 수 있는 것으로 보이며 자바의 boolean 타입은 1Byte지만 사실 비트 연산으로 이것을 표현하면 1비트로 표현할 수 있다.
집합과 true false
비트 마스킹을 사용해서 집합을 표현할 수 있다.
// 공집합
int x = 0;
// x 집합에 y 추가 (y비트를 1로 세트한다.)
x |= (1 << y);
// x 집합에 y 제거 (y비트를 0으로 세트한다.)
x &= ~(1 << y);
// x 집합에 y가 존재하는지 체크
(x & (1 << y) == (1 << y))
// x 집합에 모든 원소를 채운다. (집합의 최대 크기가 y라고 가정)
x = (1 << y+1) -1;
위와 같이 비트를 통해서 boolean[]을 표현하거나 집합을 표현할 수 있다.
다음 포스트는 비트 마스킹을 이용해서 boolean[]을 대체한 결과를 테스트해본 포스트이다.
[JAVA] 백준 2961
2961번: 도영이가 만든 맛있는 음식 첫째 줄에 재료의 개수 N(1 ≤ N ≤ 10)이 주어진다. 다음 N개 줄에는 그 재료의 신맛과 쓴맛이 공백으로 구분되어 주어진다. 모든 재료를 사용해서 요리를 만들
g-db.tistory.com
다음 포스트는 비트 마스킹을 이용해서 집합을 표현한 문제이다.
[JAVA] 백준 15787
15787번: 기차가 어둠을 헤치고 은하수를 입력의 첫째 줄에 기차의 수 N(1 ≤ N ≤ 100000)과 명령의 수 M(1 ≤ M ≤ 100000)가 주어진다. 이후 두 번째 줄부터 M+1번째 줄까지 각 줄에 명령이 주어진다. www.
g-db.tistory.com
결론
비트 마스킹을 사용하면 boolean[]을 대체할 수 있고 집합을 표현할 때 속도와 메모리 효율을 높일 수 있다.
'알고리즘' 카테고리의 다른 글
[Algorithm] Next Permutation 알고리즘 (0) | 2024.04.16 |
---|---|
[Algorithm] 최소 공통 조상 LCA란? (0) | 2024.03.09 |
[Algorithm] 세그먼트 트리란? (0) | 2024.03.07 |