nums는 숫자로 이루어진 배열입니다. 가장 자주 등장한 숫자를 k 개수만큼 return 해주세요.
✔️ nums = [1,1,1,2,2,3]
와 k = 2
가 parameter로 주어진다면, [1,2]
를 반환한다.
✔️ nums = [1]
와 k = 1
가 주어진다면, [1]
를 반환하는 함수를 작성해야 한다.
✔️ 즉, 전달된 리스트 중 요소의 갯수가 가장 큰 것부터 list에 추가해서 k개만큼 반환하면 된다.
def top_k(nums, k): set_nums = set(nums) count_dict = {i:nums.count(i) for i in set_nums} res = [] for j in range(k): max_key = max(count_dict, key=count_dict.get) res.append(max_key) del count_dict[max_key] return res nums = [1,1,1,2,2,3] k = 2 print(top_k(nums, k)) # [1, 2]
✔️ nums를 set함수로 캐스팅해서 유일한 수만 남긴 뒤, 이를 컴프리헨션 문법으로 딕셔너리로 변환하였다. 이 딕셔너리의 key는 해당 숫자이고, value는 해다 숫자의 갯수가 매핑된다.
✔️ 이제 k번 만큼 반복하여 딕셔너리의 value가 가장 큰 key값을 확인한다. 이 값이 가장 자주 등장한 숫자다.
✔️ 이제 가장 자주나타나는 수를 찾았으니, 이를 빈배열에 담아주고 del함수로 딕셔너리에서 지워준다.
✔️ k번만큼 반복한 뒤, 빈배열이엇던 res를 반환하면 이게 답이다.
def top_k(nums, k): set_nums = set(nums) result = [(target, nums.count(target)) for target in set_nums] result.sort(key = lambda x : -x[1]) return [result[i][0] for i in range(k)] nums = [1,1,1,2,2,3] k = 2 print(top_k(nums, k)) # [1, 2]
✔️ 이 방법은 숫자와 그 숫자의 갯수를 리스트 안에 튜플로 넣어 푸는 방식이다.
result = [ (key1, count_key1), (key2,count_2), (key3, count_3), (keyN, count_N), ..... ]
✔️ 튜플의 index 1번 값이 갯수를 의미하기 때문에 이를 기준으로 정렬해서 0번 index값을 k번만큼 반복하여 리스트에 담아버린다.
1. value값이 가장 큰 key를 찾는 방법에 있어서 처음엔 lambda로 만들어줘야하는줄 알았는데, get을 통해 가능했다.
2. 문제가 간결해서 이해가 처음에 어려웠다. 예시를 먼저 보고 문제를 확인하자.
3. key와 value로 쌍을 만들어 풀어야하는 아이디가 떠오른다면, 딕셔너리도 있지만 튜플도 함께 떠올리자!