본문 바로가기

알고리즘/프로그래머스

[파이썬] 프로그래머스 알고리즘 고득점 Kit - 해시 / 의상 완벽해설

문제

 

 

해설

 

이 문제를 풀기 위해서 나의 경우는 "딕셔너리" 자료 구조를 사용하여 풀어냈다. 문제가 "해시" 자료 구조 카테고리에 있었기 때문에 자연스레 딕셔너리를 사용할 생각을 했다.

 

문제 풀이는 우선 의상의 종류별로 딕셔너리에 잘 정리해둔 후, 모든 경우의 수를 계산해주기만 하면 된다.

 

    cloth_dict = {}
    categories = []
    for i in range(len(clothes)):
        cloth, category = clothes[i]
        if category not in categories:
            categories.append(category)
            cloth_dict[category] = [cloth]
        else:
            cloth_dict[category].append(cloth)

 

가장 먼저 clothes에 있는 값들을 종류별로 딕셔너리에 담아준다. 종류별로 의상이 하나가 아니라 두개일 경우를 대비해서 각각의 key에 해당하는 value 값은 리스트로 저장해준다. 그래서 하나하나 append 하여 리스트를 늘리는 방식을 사용한다.

 

이제 경우의 수를 계산해주면 되는데,

 

    keys = cloth_dict.keys()
    num_cnts = 1
    for key in keys:
        num_cnts *= (len(cloth_dict[key])+1)
    answer = num_cnts - 1
    return answer

 

이 경우 각각 종류별 의상의 수에다가 1을 더한 값을 매번 곱해준다. 그 이유는 각각의 의상의 종류별로 경우의 수는 "아무것도 입지 않았을 경우"도 포함되기 때문이다.

 

그리고 그렇게 계산된 마지막 값에 1을 빼주면 된다. 왜냐하면 문제에서 "최소 한개의 옷은 입습니다" 라는 조건이 주어졌기에, 아무것도 입지 않은 경우의 수 1을 빼준 것이다.

 

 

코드
def solution(clothes):
    answer = 0
    cloth_dict = {}
    categories = []
    for i in range(len(clothes)):
        cloth, category = clothes[i]
        if category not in categories:
            categories.append(category)
            cloth_dict[category] = [cloth]
        else:
            cloth_dict[category].append(cloth)
    
    keys = cloth_dict.keys()
    num_cnts = 1
    for key in keys:
        num_cnts *= (len(cloth_dict[key])+1)
    answer = num_cnts - 1
    return answer

 

 

결과