<문제>
https://programmers.co.kr/learn/courses/30/lessons/42578
<소스코드>
첫번째 풀이
def solution(clothes):
answer = 0
dic = {}
for name, categroy in clothes:
if category not in dic:
dic[category] = 1
else:
dic[category] += 1
a = 1
for i in dic.values():
a *= (i + 1)
answer = a - 1
return answer
두번째 풀이
import collections
def solution(clothes):
answer = 1
category = []
for i, j in clothes:
category.append(j)
dic = collections.Counter(category)
for i in dic.values():
answer *= (i + 1)
return answer - 1
<NOTE>
■ 리스트나 딕셔너리 같은 container의 개수에 대한 정보가 필요할 때
import collections
lst = ['banana', 'banana', 'apple', 'apple', 'apple']
count_lst = collections.Counter(lst)
print(count_lst) #{'banana': 2, 'apple': 3}
import collections를 통해 collections.Counter() 함수를 사용할 수 있다. 리스트 내의 요소를 key로 하고, 중복되는 개수를 value로 하여 dictionary형태로 반환한다.
■ 파이썬 자료구조 중 dictinary를 사용할 때, key에 대한 value가 없는 경우 효율적으로 처리할 수 있는 방법
1) setdefault
lst = ['banana', 'banana', 'apple', 'apple', 'apple']
dic = {}
for i in lst:
dic.setdefault(i, 0)
dic[i] += 1
해당 값이 dictionary에 없을 때, 그 값을 key로 만들어 주는 상황이 많다. 이 때, 그 key에 대한 value를 0으로 채우곤 한다. 그 대신 setdefault함수를 이용하여 dicionary에 setdefault(key, value)를 설정하면 dictionary안에 해당 key가 없으면 key:value 쌍으로 저장한다. 그러나 setdefault는 key의 여부와 상관없이 호출되므로 이를 개선하기 위해 collections모듈의 defaultdict클래스를 사용할 수 있다.
2) collections.defaultdict(int/list/등)
import collections
lst = ['banana', 'banana', 'apple', 'apple', 'apple']
dic = collections.defaultdict(int)
for i in lst:
dic[k] += 1
collections.defaultdict는 dictionary자체가 key의 value가 default로 들어가있기 때문에, value가 없어도 에러를 출력하지 않고 default값을 출력한다. for문을 통해 dictionary안에 해당 값 없을 경우, 그 값을 key로 만들어주는 작업이 통째로 사라지므로 setdefault보다 빠르다. collections.default(int)에서 int외에 list등 value가 될 수 있는 다른 자료형을 지정할 수 있다.
'알고리즘 > 해시' 카테고리의 다른 글
#6 [파이썬] 프로그래머스 완주하지 못한 선수 (0) | 2021.04.05 |
---|
댓글