알고리즘 문제 풀다 보면 비트마스킹이란 게 자꾸 나오는데요. 방문 여부 같은 걸 배열 대신 정수 하나로 표현한다는 설명은 들었는데 도대체 이걸 왜 굳이 그렇게 하는 건지 이해가 안 됩니다.
제가 아는 건 이 정도예요.
visited |= (1 << i) // i번째 켜기
if visited & (1 << i): // i번째 켜져있나 확인
visited &= ~(1 << i) // i번째 끄기
연산 자체는 대충 알겠는데, 이걸 실제로 어떤 문제에서 써야 이득인 건지 그 감이 없어요. 그냥 boolean 배열 쓰면 되는 거 아닌가 싶고요.
외판원 순회(TSP)나 집합을 다루는 DP에서 많이 쓴다고는 들었는데, 정수 하나로 "지금까지 방문한 도시 집합"을 통째로 표현할 수 있어서 그걸 DP 상태 키로 쓰는 거 이게 핵심인가요? 그러니까 상태가 부분집합 형태일 때 배열로는 키를 못 만드니까 정수로 압축하는 거다, 이렇게 보면 되나요?
N이 대략 몇 개 이하일 때 이 기법을 고려하는 게 맞는지도 궁금하고, 비트마스킹이 좋은 신호(문제 조건)가 따로 있는지도 알고 싶습니다. 언제 "아 이건 비트마스킹이네" 하고 딱 떠올려야 하는 건가요?