1. 문제 설명
2. 풀이 과정
의상 종류별로 이름을 저장하는 딕셔너리 clothes_dict을 생성한다.
각 의상 종류별로 이름을 저장하기 위해 for문으로 clothes의 각 리스트를 불러와 값을 name, kind에 저장한다.
if문으로 clothes_dict에 kind 값이 없을 때 clothes_dict[kind] = [name]으로 종류와 이름을 저장한다.
kind 값이 있으면 appned() 매서드로 kind에 name을 추가한다.
조합 종합을 저장할 total_combinations를 1로 초기화한다.
for문으로 clothes_dictd의 값values()를 count로 불러온다. (리스트 형태로 불러오게 된다.)
total_combinations에 각 value의 개수를 len(count)로 구해서 1을 더한 값을 곱한다.
1을 더하는 이유는 의상을 착용하지 않는 경우를 포함하기 위해서 이다.
for문을 빠져나오면 total_combinations-1를 반환한다.
1을 빼는 이유는 모든 의상을 착용하지 않는 경우를 제외시키기 위해서 이다.
3. 코드
def solution(clothes):
clothes_dict = {}
for name, kind in clothes:
if kind not in clothes_dict:
clothes_dict[kind] = [name]
else:
clothes_dict[kind].append(name)
total_combinations = 1
for count in clothes_dict.values():
total_combinations *= (len(count) + 1)
return total_combinations - 1
4. 추천 코드
def solution(clothes):
from collections import Counter
from functools import reduce
cnt = Counter([kind for name, kind in clothes])
answer = reduce(lambda x, y: x*(y+1), cnt.values(), 1) - 1
return answer
5. 추천 코드의 풀이 과정
Counter는 키의 개수를 자동으로 세어주는 함수 (딕셔너리와 비슷한 객체)
reduce는 누적으로 결과를 계산하는 함수
Counter() 함수에 리스트로 의상 이름 name, 의상 종류 kind를 for문으로 for name, kind in clothes 받아서 kind의 개수를 추출하여 cnt에 저장한다.
reduce(lambda x,y:x*(y+1), cnt.values(), 1)으로 각 의상 종류별로 선택할 수 있는 경우의 수를 곱해준다.
초기값 1부터 시작하여, 각 의상 종류cnt.values()의 개수에 1을 더한 후 곱해준다.
모든 의상을 착용하지 않는 경우는 제외하기 위해 1을 뺀 값을 반환한다.
- reduce()함수 : reduce(함수, iterable, 초기값) //iterable : 결합할 항목들이 포함된 시퀀스(리스트,튜플 등)
- lambda 함수 : 익명 함수로, 간단한 함수를 한 줄로 정의할 수 있다.
'프로그래머스 > 알고리즘 고득점 Kit' 카테고리의 다른 글
[프로그래머스] [스택/큐] Lv.1 /같은 숫자는 싫어 (파이썬/Python) (0) | 2025.03.29 |
---|---|
[프로그래머스] [해시] Lv.3 /베스트앨범 (파이썬/Python) (0) | 2025.03.28 |
[프로그래머스] [해시] Lv.2 /전화번호 목록 (파이썬/Python) (0) | 2025.03.25 |
[프로그래머스] [해시] Lv.1 /완주하지 못한 선수(파이썬/Python) (0) | 2025.03.21 |
[프로그래머스] [해시] Lv.1 /폰켓몬 (파이썬/Python) (0) | 2025.03.19 |