728x90
문제
N개의 10진수 정수가 주어진다. 플레이어에게 정수를 그냥 정렬하는 것은 너무 쉽기 때문에, 아래 기준에 따라 정수를 정렬하기로 한다.
10진수 정수를 2진수로 나타냈을 때, 2진수에 포함된 1의 개수를 기준으로 내림차순 정렬한다.
1의 개수가 같다면, 원래 10진수를 기준으로 내림차순 정렬한다.
플레이어가 정수를 잘 정렬했을 때, 앞에서 K번째에 위치한 수는 어떤 수가 될 지 구해보자.
입력
첫째 줄에 주어지는 정수의 수 N과 플레이어가 찾으려는 정수의 위치 K가 공백을 두고 주어진다.
둘째 줄에 정수 a1,a2,⋯,aN이 공백을 두고 주어진다.
- 1≤N≤500 000
- 1≤K≤N
- 1≤ai≤220
출력
기준에 따라 정렬된 정수 중, 앞에서 K번째에 위치한 수를 출력한다.
문제 접근 방식
파이썬의 bin함수를 이용하여 이진수로 만들어 준 뒤, 이를 map함수와 int함수를 활용하여 1의 개수를 세어주었다.
이 개수와 원래 숫자를 튜플로 만들어 새로운 리스트에 넣고, 이를 sort함수로 정렬해주었다.
정답 코드
# 이진수 정렬
import sys
input = sys.stdin.readline
N, K = map(int, input().rstrip().split())
num_li = list(map(int, input().rstrip().split()))
new_li = []
for i in range(N):
new_li.append((sum(map(int, bin(num_li[i])[2:])), num_li[i]))
new_li.sort(reverse = True)
print(new_li[K-1][1])
특별히 배운 점
2진수의 성질을 이용하면 더 빠르게 할 수도 있을 것 같다. 파이썬의 bin함수는 string으로 반환하기 때문에 느리다.
만약 제한이 더 커진다면 2진수의 성질을 이용하는 다른 풀이를 강구해봐야 할 것이다.
'알고리즘 > 구름톤 챌린지' 카테고리의 다른 글
[구름톤 챌린지] 2주차 7일차 구름 찾기 깃발 (0) | 2023.08.23 |
---|---|
[구름톤 챌린지] 2주차 6일차 문자열 나누기 (0) | 2023.08.21 |
[구름톤 챌린지] 1주차 4일차 완벽한 햄버거 만들기 (0) | 2023.08.19 |
[구름톤 챌린지] 1주차 3일차 합 계산기 (0) | 2023.08.19 |
[구름톤 챌린지] 1주차 2일차 프로젝트 매니징 (0) | 2023.08.19 |