티스토리 뷰

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.

예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.

경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.

제한 사항

- 1 ≤ k ≤ tangerine의 길이 ≤ 100,000
- 1 ≤ tangerine의 원소 ≤ 10,000,000

 

 

문제 접근 방법

1. tangSzie를 저장할 Dict형 자료형을 선언한다.

2. for문을 통해 tangerine 배열의 요소값을 사이즈 별로 카운팅 한다.

  ex) [1, 1, 1, 1, 2, 2, 3] 이면 tangSzieDict = {1:4, 2:2, 3:1} 

3. tangSzieDict를 value 값을 기준으로 내림차순 정렬한다.

4. 귤 상자의 크기(k) 값이 될 때까지 정답을 1씩 더해준다.

 

더보기

내가 짠 정답 소스코드

def solution(k, tangerine):
    answer = 0
    sizeDic = {}

    for i in tangerine:
        if i in sizeDic:
            sizeDic[i] += 1
        else:
            sizeDic[i] = 1

    valueList = sorted(sizeDic.values(), reverse=True)

    for i in valueList:
        if k > i and k > 0:
            answer += 1
            k -= i
        else:
            answer += 1
            return answer

    return answer

5 ~ 9 line : tangerine 배열을 한 개씩 순차적 가져와 sizeDic에 값이 있는지 확인 후 1을 더해주거나, 1로 세팅해 준다.

 

11 line: value값을 기준으로 내림차순 정렬해 준다.

 

13~ 끝 : 정렬된 배열을 기준으로 k값이 0이 될 때까지 1씩 더해준다.

 

리펙터링 소스코드

더보기
import collections

def solution(k, tangerine):
    answer = 0
    sizeDic = collections.Counter(tangerine)

    valueList = sorted(sizeDic.values(), reverse=True)

    for i in valueList:
        answer += 1
        k -= i
        if k <= 0:
            break

    return answer

전체적인 접근 방법은 같다.

다만, python3 collections.Counter를 이용하면 손쉽게 사이즈별로 카운트할 수 있다.

(나는 일일이 for으로 카운팅 했는데..)

 

def solution(k, tangerine):
    sizeDic = collections.Counter(tangerine)
    print(sizeDic)

solution(  4, [1, 3, 2, 5, 4, 5, 2, 3])

 

 

출력값 

 

테스트 내용

#collections Counter 테스트
import collections
c = collections.Counter(a=3, b=1)
d = collections.Counter(a=2, b=2, c=0)
print('c : ', c)
print('d : ', d)
print('c-d : ', c-d)
print('c & d : ', c & d)   #min
print('c | d  : ', c | d ) #max
print('c == d  : ', c == d ) #c == d
print('c <= d  : ', c <= d ) #C<=d

 

출력값

 

기존 코딩테스트 문제를 풀다 보면 리스트에서 요소별 값을 카운팅 하거나, 교집합, 합집합 등 연산이 필요한 경우가 많은데

편리하게 사용할 수 있을 것 같다.

 

python3 Document 

https://docs.python.org/ko/3/library/collections.html?highlight=collections#collections.Counter

 

collections — Container datatypes

Source code: Lib/collections/__init__.py This module implements specialized container datatypes providing alternatives to Python’s general purpose built-in containers, dict, list, set, and tuple.,,...

docs.python.org

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함