난이도는 크게 어렵지 않았지만, functools 패키지의 reduce 함수와 lambda 함수를 적절히 이용한다면 그보다 훨씬 쉽게 접근할 수 있는 문제였습니다. 이 문제를 통해 reduce에 대해 공부할 수 있었습니다!

문제

위장 링크

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

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

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

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

제한사항

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

입출력 예

사진 1

내 풀이

이 문제의 포인트는 같은 이름을 가진 의상은 존재하지 않는다는 점이라고 생각합니다. 덕분에 문제를 쉽게 풀어나갈 수 있기 때문입니다. 저는 각각의 의상 종류에 대한 총 개수를 알고 싶었습니다. 예를 들어, 상의는 총 몇 벌인지, 얼굴 치장은 총 몇 가지를 할 수 있는지를 알고 싶었습니다. 각각의 개수만 안다면 1를 더하고 모두 곱한 다음, 1을 빼주기만 하면 답이 나오기 때문입니다. 위의 입출력 예의 첫 번째 문제를 예시로 들면 headgear는 2가지, eyewear는 1가지입니다. headgear는 아예 안 쓰는 경우, 2가지 중 쓰는 경우가 있으므로 총 3가지의 경우의 수가 존재합니다. eyewear도 아예 안 쓰는 경우와 1가지를 쓰는 경우가 있으므로 총 2가지의 경우의 수가 존재합니다.

결론적으로 $3 \times 2 = 6$이 되고, 아무 의상도 입지 않는 경우의 수 1를 빼면 return인 5가 나오게 됩니다. 이와 같이 코드를 만들었습니다.

# Counter : 각각 원소의 Count를 계산
from collections import Counter

def solution(clothes):
  
    answer = 1
    types = []
    for i in clothes :
      types.append(i[1])     # 종류만 가져옴

    clothes_counter = Counter(types)     # 옷 종류에 대한 Count 계산

    # 하나의 종류로 만들어 낼 수 있는 경우의 수 : (종류 + 1) -> 0 ~ 특정 종류의 개수
    temp = [(j + 1) for j in clothes_counter.values()]     
    for k in temp :     # temp  값들을 모두 곱한다.
      answer *= k

    return answer - 1     # 아무 것도 입지 않는 경우의 수를 뺀다.

다른 사람들의 풀이

유용한 함수인 reduce에 대해 먼저 알아보겠습니다. reduce는 functools 패키지에 있는 함수입니다.

reduce(함수, 리스트, 초기값)

reduce는 초기값부터 시작하여 리스트의 원소들을 연속으로 정해진 함수에 넣어주는 함수입니다. 이를 이용하여 간단하게 문제를 풀어낸 코드가 있습니다. 4 번째 줄까지는 이전 풀이와 비슷하지만, 5번째 줄에서 for문을 사용하지 않고 초기값을 1로 둔 lambda를 통해 값을 구했습니다. reduce 함수도 생소했지만, 짧은 lambda 함수를 이용하는 것에 아직 서투른 것 같습니다… 간단한 함수는 lambda를 이용해보도록 노력해야겠어요! 😁

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



DATA_100%_LOGO_LIGHT



댓글남기기