강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

tmddn_00님의 프로필 이미지
tmddn_00

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

비트마스킹 개념 #4. 비트마스킹, 경우의 수, 매개변수

120. 비트마스킹 개념 #4 질문있습니다!

해결된 질문

작성

·

13

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.


질문 1. n의 범위가 30을 넘지 않고 조합문제라면, 비트마스킹이라고 가정하고 풀어도 될까요? 아니면, 문제마다 생각하는게 좋을까요?

 

질문 2. 매개변수 설명해주시는 부분에서

for(int i=1; i<n; i++){
    go(1 | (1<<i));
}

위 부분은 0번째 인덱스인 사과가 1인경우. 즉, 사과를 포함하는 모든 경우의 수이잖아요.

여기서 사과를 포함하는 경우만 보는게 아니라 완탐을 하고싶다면, 굳이 함수 매개변수로 비트연산을 전달 안 하고 그냥 비트마스킹을 하면 되는거죠?

답변 2

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 ㅎㅎ

n의 범위가 30을 넘지 않고 조합문제라면, 비트마스킹이라고 가정하고 풀어도

-> 네 가정하고 풀어도 됩니다.


여기서 사과를 포함하는 경우만 보는게 아니라 완탐을 하고싶다면, 굳이 함수 매개변수로 비트연산을 전달 안 하고 그냥 비트마스킹을 하면 되는거죠?

-> 네 맞습니다. 저기서 1 | 1 << i 부분이 사과를 포함하는 경우의 수가 되는 것이기 때문에 -> 사과의 포함과 무관하다면 go( 1 << i) 로 구축해도 됩니다.

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. tmddn_00님, 질문 올려주셔서 감사합니다.

질문 1: n의 범위와 비트마스킹의 적용

비트마스킹은 일반적으로 n의 범위가 크지 않을 때, 예를 들어, n이 20 이하일 때 특히 유용합니다. 이는 비트 연산으로 모든 부분 집합을 효율적으로 탐색할 수 있는 장점이 있기 때문입니다. 조합 문제에서는 비트마스킹이 자연스럽게 적용될 수 있습니다. 하지만, 문제의 조건이나 최적화 요구 사항이 다를 수 있기 때문에, 문제마다 비트마스킹이 최적의 방법인지를 판단하는 것이 중요합니다. 일부 문제에서는 비트마스킹보다 다른 탐색 기법이 더 적절할 수 있습니다.

질문 2: 비트마스킹을 통한 완전 탐색

해당 매개변수에서 go(1 | (1<<i));0번째 인덱스, 즉 사과를 포함하는 모든 경우의 수를 고려합니다. 만약 사과를 포함하지 않는 완전 탐색을 원한다면 초기 값으로 사과를 포함하지 않는 상태에서 시작하도록 비트마스크를 설정해야 합니다.

즉, for 루프 내에서 이미 포함된 요소에 대해 시작하는가, 아닌가에 대한 여부는 각각의 인덱스에서 다르게 설정할 수 있으며, 사과를 무조건 포함하지 않게 선택하고자 한다면 초기 비트마스크를 다르게 설정해야 합니다. 완전 탐색을 위해서는 for (int i = 0; i < n; i++) 등으로 모든 경우의 수를 시작할 수 있습니다.

비트마스크를 사용하여 매개변수를 전달하면 부분 집합 계산이 더욱 효율적이지만, 연습 차원에서 비트 연산 없이도 다양한 방법을 시도해볼 수 있습니다.

비트마스킹에 대한 추가적인 이해를 위해 아래 링크를 참고해 보세요. 비트마스킹의 개념을 강화하는 데 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

tmddn_00님의 프로필 이미지
tmddn_00

작성한 질문수

질문하기