구름톤 챌린지 5일차 230818

Saru·2023년 8월 18일
0

구름톤 챌린지

목록 보기
5/5
post-thumbnail

몬가 푸는게 다가 아니라 정리도 해야해서 쬐끔은 귀찮아진 5일차~~

그래도 하던거 안하면 찝찝하니까 킵고잉~

문제는 요약하면, 숫자갯수 n, k번의 위치 k
가 주어지고, 다음줄에 숫자 가 공백으로 띄워져 쭉 주어진다.

이 숫자를 2진수로 변환했을 때, 1의 갯수가 많은 순서대로 내림차순으로 정렬하고 이때 동일한 갯수를 가지는 수가 있다면 본래의 수를 내림차순으로 정렬한
k번째 수의 위치를 처음 주어진 숫자로 리턴하면 되는 문제이다.

# 입력
n, k = map(int, input().split())
num_list = map(int, input().split())

# 본래의 수, 1의 갯수를 가지는 리스트 생성 
bin_num_list = []
for x in num_list:
	bin_num_list.append([x, int(str(format(x, 'b')).count('1'))])

# 1의 갯수가 많은 순(index1번째), 동일하면 본래 수가큰수 (index0번째) 내림차순 정렬
bin_num_list.sort(key= lambda x : (x[1], x[0]), reverse=True)

# k번째 (k-1 index) 의 본래의 수 (index 0번째) 출력
print([bin_num_list[i][0] for i in range(n)][k-1])

5일차니 만큼 lambda 정렬에 대한 부분은 검색을 통했다.

일단 숫자를 모두 받아서 리스트로 만들어주는 김에
2진수로 변환 -> str 변환 -> .count('1') 함수로 갯수 를 구해주고
다시 int화 시킨다. 이후에
[본래의수, 1의갯수] 인 리스트로 만들어 준다 그럼 예시1의 경우

bin_num_list = [[1, 1], [2, 1], [3, 2], [4, 1], [5, 2], [6, 2], [7, 3], [8, 1]]
가 완성된다. 이제 이것을 비교해서 정렬만 해주면되는데,

sort 옵션중에 어떤것을 기준으로 할지 key를 줄수 있는데, 이떄 람다 식을 이용해서 정렬이 가능 하다고 한다. 그리고 내림차 순 이기때문에 reverse=True 옵션을준다.

여기 까지 진행하면
bin_num_list = [[7, 3], [6, 2], [5, 2], [3, 2], [8, 1], [4, 1], [2, 1], [1, 1]]
이 되는데, 우리가 필요한건 k번째, 즉 k-1 인덱스에 본래의 수이기떄문에
k-1 인덱스 리스트에 0 인덱스 값만 프린트 해주면 끝이난다.

지난 해설들을 봐도 코드들은 조금씩 다른데, 구현 아이디어는 어느정도 비슷한걸 보니 문제를 파악하는데 있어서 조금씩 익숙해 지는것 같다.
아이디어만 얼추 맞으면, 구현해 내는 코드들은 검색하고, 체득하면 되는거니까 일단 아이디어를 어떻게 가져가면 될 지 연습이 되는것 같아서 보람차다!

오늘의 구름이는 뚫어뻥 깃발을 어디서 훔쳐왔나보다...ㅋㅋㅋ

profile
우당탕탕 개발기

0개의 댓글