https://school.programmers.co.kr/learn/courses/30/lessons/42578
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
I. 문제 개요
의상을 최소 하나 이상 선택하는 경우의 수를 구하는 문제이다.
II. 알고리즘 및 풀이
1. 의상 분류
ans = 0
dct = dict()
for cloth in clothes:
name, category = cloth
if category in dct.keys(): # 이전에 본 카테고리라면
dct[category].append(name) # value(list)에 의상 추가
else: # 처음 보는 카테고리라면
dct[category] = [name] # 딕셔너리에 넣기
딕셔너리를 선언하고, 의상을 종류별로 저장한다.
딕셔너리의 value는 list 형식이다.
2. 경우의 수 계산
headgear: 2 + 1(하나도 안입는 경우)
* eyewear: 1 + 1(안쓰는 경우)
---------------------------------------
총 경우의 수: (2 + 1) * (1 + 1) - 1
= 3 * 2 - 1
= 6 - 1
= 5
"예제 #1"을 기준으로 살펴보자.
모자를 쓰는 경우는 3가지, 안경류를 쓰는 경우는 2가지이다.
다만,모자와 안경류 둘 다 안쓰는 경우 1개는 제외해야 한다.
따라서, 구하려는 경우의 수는 3 * 2 에서 1을 뺀, 5가 답이다.
이를 코드로 옮기면 아래와 같다.
for cat in dct.keys():
combi = len(dct[cat]) + 1 # 경우의 수 = (의상의 갯수) + 1(안입는 경우)
if ans == 0: # ans가 초기화된 상태라면
ans = combi # combi로 초기화
else:
ans *= combi # 곱하기로 계산
return ans - 1 # 하나도 안입는 경우는 제외
각 종류별로 의상을 1개 이하로 선택하는 경우의 수를 구한 값들을 모두 곱한다.
여기에서 1을 빼면 구하려는 경우의 수를 구할 수 있다.
III. 전체 코드
def solution(clothes):
# 1. 의상 분류
ans = 0
dct = dict()
for cloth in clothes:
name, category = cloth
if category in dct.keys(): # 이전에 본 카테고리라면
dct[category].append(name) # value(list)에 의상 추가
else: # 처음 보는 카테고리라면
dct[category] = [name] # 딕셔너리에 넣기
# 2. 경우의 수 계산
for cat in dct.keys():
combi = len(dct[cat]) + 1 # 경우의 수 = (의상의 갯수) + 1(안입는 경우)
if ans == 0: # ans가 초기화된 상태라면
ans = combi # combi로 초기화
else:
ans *= combi # 곱하기로 계산
return ans - 1 # 하나도 안입는 경우는 제외
IV. 제출 결과
