[파이썬] 백준 30015 : 학생회 뽑기 (골드3)
30015번: 학생회 뽑기
2, 3, 4번 학생을 학생회로 뽑으면 $X=31\,\&\, 27\,\&\, 29=11111_{(2)}\,\&\, 11011_{(2)}\,\&\, 11101_{(2)}=11001_{(2)}=25$ 가 된다. 학생회의 능력이 $25$를 넘도록 학생회 멤버를 뽑을 수 없음을 증명할 수 있다.
www.acmicpc.net
문제
풀이
방향성 생각
- 20자리 비트를 모두 체크한다.
- 100(2) > 11(2). 비트의 자리수가 커지면 이전 비트들을 모두 합해도 더 크다. (등비수열 합)
- MSB부터 순차적으로 확인한다.
- 특정 비트 자리수에서 1이 K개 이상이면 그 숫자들을 모으고 낮은 비트 자리수 체크를 반복
전체코드
N,K = map(int,input().split())
info = list(map(int,input().split()))
answer = 0
for i in range(19,-1,-1):
temp = []
for num in info:
if num&(1<<i):
temp.append(num)
if len(temp) >= K:
answer += 1<<i
info = temp
print(answer)
- 특정 자리수의 1이 K개가 넘어가면, 해당 숫자들은 모두 AND연산으로 1을 만들 수 있다.
- 이 때 answer에 값을 업데이트 해주고, info를 선택한 숫자들로 업데이트 한다.
코멘트
.
'Algorithm > Greedy' 카테고리의 다른 글
[파이썬] 프로그래머스 : 인사고과 (레벨3) (0) | 2024.04.02 |
---|---|
[파이썬] 백준 1736 : 쓰레기 치우기 (골드1) (0) | 2024.02.18 |
[파이썬] 프로그래머스 : n+1 카드게임 (Lv.3) (0) | 2024.01.18 |
[파이썬] 백준 13904 : 과제 (골드3) (0) | 2023.12.19 |
[파이썬] 백준 2109 : 순회강연 (골드3) (0) | 2023.12.12 |
[파이썬] 백준 2258 : 정육점 (골드4) (0) | 2023.12.10 |
[파이썬] 백준 1781 : 컵라면 (골드2) (0) | 2023.11.30 |
댓글