Algorithm

귤 고르기 [Programmers/ Python]

김디니 2023. 1. 6. 17:25

경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 '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개의 귤만 가지고 있는 귤의 종류는 판매되지 않게 된다.