문제
https://school.programmers.co.kr/learn/courses/30/lessons/138476
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.
제한사항
1 ≤ k ≤ tangerine의 길이 ≤ 100,000
1 ≤ tangerine의 원소 ≤ 10,000,000
입출력 예
k tangerine result
6 [1, 3, 2, 5, 4, 5, 2, 3] 3
4 [1, 3, 2, 5, 4, 5, 2, 3] 2
2 [1, 1, 1, 1, 2, 2, 2, 3] 1
풀이
from collections import Counter
def solution(k, tangerine):
answer = 0
# 각 원소의 갯수 count
dic = dict(Counter(tangerine))
# value 를 기준으로 내림차순 정렬
sort_ = sorted(dic.items(), key = lambda x:x[1], reverse = True)
for i in sort_:
# 수량이 많은 귤부터 담기
'''
내림차순 정렬된 value값을 k(상자에 담을 수 있는 귤 개수)에서 빼주면서 반복한다.
answer 값에 1씩 카운트해주며 (종류)
k가 0보다 작을때 (다 찼을 때) answer를 출력
'''
k -= i[1]
answer += 1
if k <= 0:
break
return answer
설명
- 딕셔너리 정렬 까지는 했으나, 그 뒤 '서로 다른 종류의 수의 최솟값으로 출력' 로직을 구현하지 못했다. (코드에서는 for 루프)
필요 개념
1. collections - Counter 함수
- 리스트 내의 원소의 갯수를 구하는 함수
2. 딕셔너리 (dictionary)
- 딕셔너리를 정렬하고자 할 때는 sorted() 를 사용하며, 기본값은 오름차순 이다.
내림차순으로 정렬하고 싶은 경우에는 sorted() 함수의 매개변수로 revert=True 값 추가.
1) key 기준으로 정렬
dic = {"dream": 0, "car": 99, "blockdmask": 1, "error": 30, "app": 20}
# key 값을 기준으로 정렬된 (key,value) 원소쌍을 가진 리스트 출력
print('ans1::', sorted(dic.items()))
# key 값을 기준을 정렬된 딕셔너리 생성
dic = dict(sorted(dic.items()))
print('ans2::', dic)
결과

2) value 기준으로 정렬
dic = {"dream": 0, "car": 99, "blockdmask": 1, "error": 30, "app": 20}
# value 값을 기준으로 오름차순 정렬하여 (k, v) 리스트 반환
print('ans3:::', sorted(dic.items(), key=lambda x:x[1]))
# 위 값을 딕셔너리로 변환
print('ans4:::', dict(sorted(dic.items(), key=lambda x:x[1])))
# value 값을 기준으로 오름차순 정렬
print('ans5:::', sorted(dic,key=lambda x:dic[x]))
결과

** lambda
=> 2차원 이상의 객체들을 정렬하기 위해 사용!
-단순한 1차원의 iterable(리스트, 튜플, 딕셔너리) 객체들은 sorted 혹은 sort 함수를 이용해서 정렬하면 되지만, 2차원 이상의 객체들은 다양한 기준으로 정렬할 수 있기 때문에 lambda를 활용하면 매우 편리하다.
- lambda옆에 x값은 함수의 매개변수로 사용되고 :옆 x+1은 매개변수를 사용한 결과값이다.
문제에서 사용했던 코드로 예시를 들어본다.
# value 를 기준으로 내림차순 정렬
sort_ = sorted(dic.items(), key = lambda x:x[1], reverse = True)
딕셔너리의 키 값들을 매개변수 x에 넣어 x[1] 즉, dic의 value 값으로 내림차순 정렬하여 키 값을 출력
'Coding Test > Python' 카테고리의 다른 글
| [프로그래머스] 더 크게 합치기 (0) | 2023.06.13 |
|---|---|
| [프로그래머스] 문자열 섞기 (0) | 2023.06.12 |
| [프로그래머스] 방문 길이 (1) | 2023.06.09 |
| [프로그래머스] 스킬트리 (0) | 2023.06.09 |
| [프로그래머스] 멀리 뛰기 (2) | 2023.06.09 |