Hikenny25

2일차 - 부분집합의 합 본문

SW Expert Academy/Programming - Intermediate

2일차 - 부분집합의 합

hikenny 2023. 12. 8. 21:58
def howmany1(n):
    cnt = 0
    while(n != 0):
        if(n & 1):
            cnt += 1
        n = n >> 1
    
    return cnt

t = int(input())
answer = list()

for _ in range(t):
    a = [1,2,3,4,5,6,7,8,9,10,11,12]
    n, k = map(int, input().split())

    subset = list()
    for i in range(1 << 12):
        var = list()
        if howmany1(i) != n:
            continue
        
        for j in range(12):
            if(i & (1 << j)):
                var.append(a[j])
        
        subset.append(var)

    cnt = 0
    for i in subset:
        if sum(i) == k:
            cnt += 1

    answer.append(cnt)

for i in range(t):
    print(f"#{i+1} {answer[i]}")

 

- howmany1(n)

자연수 n을 이진수로 변환했을 때 1이 몇 개 들어있는지 반환하는 함수!

들어온 값을 1씩 right 연산 해주면서 1과 & 연산으로 비교하여 얻었다.. 만든 이유는 부분집합 원소 개수가 아닌 걸 걸러내기 위해서..

 

아직은 역량 부족으로 거의 brute-force 형식으로 찾은 것 같다

그래도 SWEA 강의에서 배운 비트를 통해 부분집합을 생성하는 알고리즘을 이해하고 사용해봐서 의미있던 문제인듯!

'SW Expert Academy > Programming - Intermediate' 카테고리의 다른 글

2일차 - 특별한 정렬  (0) 2023.12.09
2일차 - 이진탐색  (0) 2023.12.09
2일차 - 색칠하기  (1) 2023.12.08
1일차 - 구간합  (1) 2023.12.08
1일차 - 숫자 카드  (1) 2023.12.08
Comments