민규의 흔적

[Python 파이썬] 프로그래머스 - 귤 고르기 본문

프로그래머스

[Python 파이썬] 프로그래머스 - 귤 고르기

민규링 2024. 8. 6. 01:39

2024년 8월 6일

문제 링크 : 프로그래머스 - 귤 고르기


문제 접근

 

그리디하게 접근해 간단하게 풀 수 있는 문제라고 판단했다. 

 

각 귤마다 이산 값을 가지며, 상자 하나에 k개의 귤을 담고자 할 때 귤의 크기 종류가 최소가 되도록 하고 싶으므로

각 크기 별 귤의 개수를 딕셔너리에 저장해 각 value 값을 리스트 형태로 뽑아와 내림차순 정렬하여 종류가 많은 귤부터 상자에 넣으면 된다고 결론냈다. 

 

k = 6, tangerine = [1, 3, 2, 5, 4, 5, 2, 3] 인 입력 예시를 들어보자.

 

각 크기별 개수를 딕셔너리 형태로 담아내면 다음과 같다.

 

dict = {1 : 1, 2 : 2, 3 : 2, 4 : 1, 5 : 2}

 

각 value 값을 리스트 형태로 뽑아내면 다음과 같다.

 

[1, 2, 2, 1, 2]

 

이를 내림차순으로 정렬하면 다음과 같다.

 

[2, 2, 2, 1, 1]

 

각 무게 별 개수가 많은 귤부터 상자에 먼저 담아야 종류가 최소가 되도록 담을 수 있으므로, 리스트의 맨 앞에서부터 값을 k로부터 빼며, k가 0 이하가 되면 더 이상 상자에 그만 담도록 로직을 구성하면 된다.

 

리스트의 각 요소를 탐색할 때마다 result를 1씩 증가시켜주며, 로직이 끝났을 때의 result가 원하는 답이 된다.


 

전체 코드

 

def solution(k, tangerine):
    answer = 0

    dict = {}
    for idx in range(len(tangerine)):
        if tangerine[idx] in dict:
            dict[tangerine[idx]] += 1
        else:
            dict[tangerine[idx]] = 1

    sorted_by_cnt = []

    for _, value in dict.items():
        sorted_by_cnt.append(value)

    # 내림차순 정렬
    sorted_by_cnt.sort(reverse=True)

    for cnt in sorted_by_cnt:
        k -= cnt
        answer += 1
        if k <= 0:
            break

    return answer

if __name__ == "__main__":
    print(solution(6, [1, 3, 2, 5, 4, 5, 2, 3]))

풀이 후기

 

그리디하게 풀 수 있는 간단한 문제였다.