티스토리 뷰
문제 링크
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
- 다음 큰 숫자
- spring
- vue3란?
- python2.7
- JAVA 변수 초기화
- Mac
- vue3
- 명시적 초기화
- 숫자의표현
- 클래스초기화블럭
- 문자열만들기
- 주사위게임3
- 인스턴스초기화블럭
- python3
- LELVE1
- vue정의
- defaultdict
- 프로그래머스
- 괄호 회전하기
- collections
- level1
- composition api
- JadenCase
- Level2
- Java
- Leve2
- builder
- 초기화블럭
- optionsAPI
- 문제 리포트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |