경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.
예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.
경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.
input
k = 6
tangerine = [1, 3, 2, 5, 4, 5, 2, 3]
output = 3
전체코드
def solution(k, tangerine):
answer = 0
tan_dict = {}
for i in tangerine:
# 딕셔너리에 없으면 생성
if i not in tan_dict:
tan_dict[i] = 1
# 있으면 개수 + 1
else:
tan_dict[i] += 1
tan_dict = sorted(tan_dict.items(), key = lambda x: x[1])
cnt = 0
while k > 0:
k -= tan_dict.pop()[1]
answer += 1
return answer
문제 풀이 포인트
- 딕셔너리
- 귤 종류가 나열되어 있는 리스트를 딕셔너리로 만든다
- lambda
코드 디테일
딕셔너리 생성
answer = 0
tan_dict = {}
for i in tangerine:
# 딕셔너리에 없으면 생성
if i not in tan_dict:
tan_dict[i] = 1
# 있으면 개수 + 1
else:
tan_dict[i] += 1
여러 종류의 귤이 들어있는 tangerine을 for문을 통해 하나씩 꺼내주면서 딕셔너리에 값을 생성한다.
만약 i의 값이 tan_dict에 없다면 value 1의 값과 함께 할당하고,
이미 값이 tan_dict에 있다면 value값에 1을 더해준다.
lambda를 통한 딕셔너리 정렬
tan_dict = sorted(tan_dict.items(), key = lambda x: x[1])
value값을 기준으로 오름차순 해준다.
이때 람다함수를 사용하게 되는데 x라는 매개변수를 x[1]의 결과값으로 반환하는 것이다.
x[1]로 결과값을 반환하기 때문에 value값을 기준으로 정렬하게 되는 것이다.
value값을 기준으로 tan_dict의 딕셔너리의 key-value인 한 쌍의 값을 tan_dict 리스트에 할당해준다.
여기서 강조할 점은 items() 함수로 key-value 값을 튜플 형식으로 할당해준다.
할당 받는 tan_dict은 딕셔너리가 아닌 리스트 타입이다.
중복되는 귤의 종류 삭제 및 카운트
while k > 0:
k -= tan_dict.pop()[1]
answer += 1
return answer
k의 값이 0이 될 때 까지 while문을 실행한다.
판매하려는 귤의 개수인 k에서 각 해당 귤의 개수만큼 빼준다.
빼준 후 판매되는 귤의 종류 개수를 카운트하기 위해 answer에 1씩 더해준다.
이때 tan_dict 리스트에 pop() 함수를 사용하여 맨 오른쪽 값부터 빼준다.
2개 이상, 하나의 종류에 많은 귤을 가지고 있는 값부터 빼주기 위해 오른쪽부터 값을 빼준다.
k가 0이 될 때는 1개의 귤만 가지고 있는 귤의 종류는 판매되지 않게 된다.
'Algorithm' 카테고리의 다른 글
14940. 쉬운 최단거리 [BAEKJOON / Python] (4) | 2023.01.27 |
---|---|
14226. 이모티콘 [BAEKJOON / Python] (4) | 2023.01.25 |
14502. 연구소 [BAEKJOON / Python] (0) | 2023.01.06 |
18405. 경쟁적 전염 [BAEKJOON / Python] (0) | 2023.01.06 |
1343. 폴리오미노 [BAEKJOON / Python] (0) | 2023.01.05 |