[프로그래머스-레벨2]위장 - python

iamjinseo·2022년 8월 24일
0

문제풀이-Python

목록 보기
93/134

https://school.programmers.co.kr/learn/courses/30/lessons/42578
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

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

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

제한사항

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

입출력 예

입출력 예 설명
예제 #1
headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다.

1. yellow_hat
2. blue_sunglasses
3. green_turban
4. yellow_hat + blue_sunglasses
5. green_turban + blue_sunglasses

예제 #2
face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.

1. crow_mask
2. blue_sunglasses
3. smoky_makeup

풀이

def solution(clothes):
    dic = {}
    for c in clothes:
        if c[1] in dic:
            dic[c[1]] +=1
        else:
            dic[c[1]] = 1
    cnt = 1
    for v in dic.values() :
        cnt *= (v+1) #카테고리별 옷 입을 경우
    return cnt -1
for c in clothes:
        if c[1] in dic:
            dic[c[1]] +=1
        else:
            dic[c[1]] = 1

각 옷마다 순회를 돌며 카테고리별 개수를 추가함

 cnt = 1
    for v in dic.values() :
        cnt *= (v+1) #카테고리별 옷 입을 경우
    return cnt -1
  • 딕셔너리의 value를 순회하며, 각 옷의 개수에+1을 하여, 카테고리별로 옷을 입을 경우를 산정하고, cnt변수에 곱함.
  • 아무것도 안입는 경우는 없으므로 -1함.
    이해가 안되면 아래 그림 참고.

나는 조합을 수학적으로 생각해낼 머리가 없어서...(수학 핵못함) 경우의수를 구할 방법을 몰랐음..
그리고 아무것도 안입는 경우도 빼야한다는 것도 몰랐다

역시 코딩하려면 확률과 통계를 잘해야만...!!!

남의 코드

def solution(clothes):
    from collections import Counter
    from functools import reduce
    cnt = Counter([kind for name, kind in clothes])
    answer = reduce(lambda x, y: x*(y+1), cnt.values(), 1) - 1
    return answer

Counter까지는 이해가 되는데 reduce는 뭐죠..? 저게 뭐임 ㅠㅠ ㅋㅋㅋ

reduce

reduce(집계 함수, 순회 가능한 데이터[, 초기값])

  • 파이썬의 functools 내장 모듈의 reduce() 함수는 여러 개의 데이터를 대상으로 주로 누적 집계를 내기 위해서 사용합니다.
  • 여기서, 집계 함수는 두개의 인자를 받아야 하는데요. 첫번째 인자는 누적자(accumulator), 두번째 인자는 현재값(current value)가 넘어오게 됩니다. 누적자는 함수 실행의 시작부터 끝까지 계속해서 재사용되는 값이고, 현재값은 루프 돌면서 계속해서 바뀌는 값입니다

    <<나이 합계 구하기>>
    그럼, 실습 데이터를 대상으로 reduce() 함수를 사용해서 유저들의 나이의 합을 구해보도록 하겠습니다.
    reduce(lambda acc, cur: acc + cur["age"], users, 0)
    => 227
    누작자에 초기값 0이 세팅되고, 그 다음 각 유저의 나이가 집계 함수에 의해서 계속해서 더해지게 됩니다.

설명에 의하면 x는 초기값이 1로 세팅된 누적값, y는 옷들의 종류 수가 되겠고, 누적값에 종류 수+1(즉, 해당 카테고리의 옷을 입을 경우의 수)를 계속 곱해준다.
그리고 아무것도 안입는 경우를 제하기 위해 -1을 했다 이거구만

저런 라이브러리는 어케 아는거지ㄷㄷㅋㅋ

후기

딕셔너리 써서 개수 깡으로 넣지 말고 Counter로 하는 걸 좀 배워야 함

참고

reduce

https://www.daleseo.com/python-functools-reduce/

profile
일단 뭐라도 해보는 중

0개의 댓글