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

Jewon Joel Park·2022년 6월 16일
0

Programmers-solution

목록 보기
21/34

문제 링크


문제 설명

의상의 이름과 종류 쌍들이 배열형태로 주어질 때, 의상의 종류별로 중복없이 최소 한 개 이상 착용할 수 있는 경우의 수를 반환하는 함수 작성


제한사항

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

풀이 코드

def solution(clothes):
    dic = {}
    for item, category in clothes:
        if category not in dic:
            dic[category] = [item]
        else:
            dic[category].append(item)
    
    cnt = 1
    for cat in dic
        cnt *= len(dic[cat]) + 1
    
    return cnt - 1
  • collectionsdefaultdict을 이용하여 로직 단순화
from collections import defaultdict


def solution(clothes):
    cnt = 1
    c_dict = defaultdict(list)
    for item, category in clothes:
        c_dict[category].append(item)

    for cat in c_dict:
        cnt *= len(c_dict[cat]) + 1
    
    return cnt - 1

코드 설명

  1. 경우의 수를 계산하는 문제로, 간단한 집합 개념이 포함되어 있음.
  2. 주어지는 clothes[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]형태로 주어지며, 이는 [장비 이름, 종류] 형태.
  3. clothes 배열을 for Loop으로 순회하며 해당 개체 정보를 dict()타입 변수 dic에 저장
    • 장비 종류가 dic 내부에 존재하지 않을 경우 배열의 형태로 장비 이름 추가
    • 존재할 경우 해당 장비 이름을 배열에 추가
  4. 반환할 정수 데이터 cnt 초기값을 설정하되, 다양한 종류의 조합을 계산하는 방법은 곱연산이므로, 초기값은 1로 설정
  5. dic를 순회하며 키(종류) 별 값(이름)의 수에 1을 더한 값(해당 장비를 착용하지 않았을 때 포함)을 cnt에 곱함
  6. 곱연산을 수행한 전체 경우의 수에서 아무런 장비도 착용하지 않았을 때의 경우의 수인 1을 제한 값을 반환
profile
10년을 돌고 돌아 마침내 제자리를 찾은 문과 출신 Python 개발자의 인생기록장

0개의 댓글