[프로그래머스] 위장 (파이썬)

Y_Sevin·2021년 12월 5일
0

Programmers

목록 보기
1/14

문제

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

종류이름
얼굴동그란 안경, 검정 선글라스
상의파란색 티셔츠
하의청바지
겉옷긴 코트

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한 개의 의상은 입습니다.

입출력 예

clothesreturn
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]5
[["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]]3

풀이

경우의 수를 생각해보며 풀이하면 됩니다.

의상의 종류가 모자, 상의, 하의 3가지이고 각각 3개 3개 4개의 의상이 존재한다고 가정해보겠습니다.

모자를 선택하는 경우의 수는 3, 상의를 선택하는 수는 3, 하의를 선택하는 경우의 수는 4이므로
3*3*4가 됩니다.

하지만 모자를 쓰지 않고 상의와 하의를 입을 수 있으므로 각 의상의 개수에 입지않는다 라는 선택지를 추가할 수 있습니다.

해당 선택지를 추가하게 된다면 다음 그림과 같은 모양이 나타나게 되며 4 * 4 * 5라는 식을 구할 수 있습니다.

그러나 제약사항을 보면

스파이는 하루에 최소 한 개의 의상은 입습니다.

제약사항을 만족하기 위해서는 어떤 옷이던 골라야합니다. 해당 식은 모든 옷을 입지 않는 경우의 수가 포함되어 있으므로 이를 제거한다면 제약사항을 만족시킬 수 있습니다.

그러므로 (4 * 4 * 5) -1 이라는 식이 나타나게 됩니다.

코드

def solution(clothes):
    a = {}
    for i in range(len(clothes)):
        if clothes[i][1] in a:
            a[clothes[i][1]] += 1
        else: a[clothes[i][1]] = 1
# 딕셔너리 형태로 변환하여 옷의 개수를 센다.
# {'headgear': 2, 'eyewear': 1}

    a_list=list(a.values()) # [2,1]
    num = 1

    for j in range(len(a_list)):
        num *= (a_list[j]+1)
    return num-1
   
profile
매일은 아니더라도 꾸준히 올리자는 마음으로 시작하는 개발블로그😎

0개의 댓글