# 문제
# 문제 접근
문제를 읽고 처음 입출력 예를 보고 나면 의상의 종류와 의상들을 묶어서 가능한 조합들을 모두 구하면 되겠다고 생각할 수 있다. 하지만 조금만 생각해보면 의상의 종류와 그 종류가 몇 개의 의상이 있는지만 알면 경우의 수를 구할 수 있다. 또한 같은 이름을 가진 의상이 존재하지 않기 때문에 별다른 예외처리도 필요 없음을 짐작할 수 있다.
따라서 의상의 종류가 "키"가 되고 의상의 개수가 "값"이 되는 딕셔너리를 생성하여 문제를 풀 수 있을 것이다.
# 문제 풀이
1. "의상의 종류 : 의상의 개수" 의 구조를 가진 딕셔너리를 생성한다.
2. clothes 리스트를 순회하며 딕셔너리에 저장한다.
3. 딕셔너리를 순회하며 경우의 수를 구하여 반환한다.
4. 경우의 수를 구하는 것은 수학적인 지식이 필요하다. 아래를 참고한다.
세 가지 옷 A, B, C가 있고 개수가 a, b, c라고 하면,
A를 선택하는 경우 a가지가 발생하며 선택하지 않은 경우까지 포함하여 a+1의 경우의 수가 생긴다.
마찬가지로 B, C에 대하여 b+1, c+1이 발생한다.
이 세 가지를 모두 곱하면 모든 경우의 수가 나오며, 세 가지 모두 선택하지 않은 경우를 제외하면 우리가 원하는 답이다.
따라서 대략적인 수식은 (a+1) * (b+1) * (c+1) - 1 이 된다.
옷의 종류에 따라 수식은 달라지기 때문에 위의 방식으로 루프를 돌며 구해주어야 할 것이다.
# 코드 작성
# 파라미터 clothes를 clothes_list로 바꿨다.
def solution(clothes_list):
# 경우의 수를 구할 때 곱셈을 위해 1로 초기화한다.
answer = 1
# 1. 딕셔너리 생성
type_count_dict = {}
# 2. clothes_list를 순회하며 옷의 종류와 값을 저장한다.
for clothes in clothes_list :
# 이름은 사실상 의미가 없다.
clothes_name = clothes[0]
clothes_type = clothes[1]
if clothes_type not in type_count_dict :
type_count_dict[clothes_type] = 0
type_count_dict[clothes_type] += 1
# 3. dict.keys()로 키 값(의상의 종류들)을 얻어온다.
clothes_types = type_count_dict.keys()
# 4. 경우의 수를 구한다.
for clothes_type in clothes_types :
answer = answer * (type_count_dict[clothes_type] + 1)
# 경우의 수에 1을 빼 준다.(하나도 선택하지 않은 경우)
answer -= 1
# 5. 값을 반환한다.
return answer
* 본 문제의 출처는 프로그래머스(https://programmers.co.kr/) 입니다. 문제가 될 시 삭제하겠습니다.
반응형
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 코딩테스트 고득점 Kit > 가장 큰 수 (0) | 2020.03.07 |
---|---|
[프로그래머스] 코딩테스트 고득점 Kit > K번째수 (0) | 2020.03.07 |
[프로그래머스] 코딩테스트 고득점 Kit > 베스트앨범 (0) | 2019.11.05 |
[프로그래머스] 코딩테스트 고득점 Kit > 전화번호 목록 (0) | 2019.11.05 |
[프로그래머스] 코딩테스트 고득점 Kit > 완주하지 못한 선수 (0) | 2019.11.05 |