위장(python)

이민호·2021년 3월 9일

원리

  1. 각각의 옷가지 종류의 경우에수에 안입는 경우의 수를 +1 해준다.
  2. 옷가지 종류의 경우의 수끼리 곱하여준다.
  3. 모두 안입는 경우는 없으므로 마지막 값에 -1을 해준다.
    ex)
    상의종류:3, 하의종류:2, 장갑종류:2
    (상의종류 경우의 수 +1) (하의종류 경우의 수 +1) (장갑종류 경우의 수 +1) -1

나의 풀이

  1. clothes의 [1]을 기준으로 정렬(sort) 해준다.
  2. zip을 이용해 앞뒤로 수를 비교한다.
  3. 앞뒤가 일치하면 count를 +1 해주며, 그렇지 않으면 count +1 을 누적으로 곱해준다.
  4. 마지막 요소의 앞뒤가 같다면 누적곱을 해줄 수 없으므로 반복문이 끝난뒤 누적곱을 한번더한다.
  5. 모두 안입는 경우는 없으므로 마지막 값에 -1을 해준다.
def solution(clothes):
    # clothes를 [1]을 기준으로 정렬한다.
    clothes_sort = sorted(clothes, key=lambda x: x[1])
    answer = 1
    count = 1
    # clothes의 요소들을 앞뒤로 비교한다.
    for x, y in zip(clothes_sort, clothes_sort[1:]):
        # 앞뒤의 요소가 같다면 count로 수를 센다.
        if x[1] == y[1]:
            count += 1
        #앞뒤가 다르다면 종류가 다르다는 뜻이므로 경우의 수를 곱해준다.
        else:
            answer *= count + 1
            # count를 초기화 해준다.
            count = 1
    # 만약에 마지막 값의 앞뒤가 같지않다면 answer *= count + 1를 못해줌으로 한번더 적어주고 최종결과값에 -1을 해줌으로써
    # 모두 벗는 경우의수는 제거해준다.
    answer = answer * (count + 1) - 1
    return answer

다른사람의 풀이

  1. Counter 이용
    1) Counter 를 이용해 각각의 종류의 갯수를 알아낸다.
    -> Counter({'headgear': 2, 'eyewear': 1})
    2) value이 경우의 수이므로 (경우의수 + 1) 해준다.
    3) 이것의 곱을 누적시킨다.
    4) 마지막 값에 -1(모두안입는 경우 고려)해준다.
def solution(clothes):
    from collections import Counter
    cases = 1
    kind_of_clothes = Counter([clothe for _ , clothe in clothes])
    for value in kind_of_clothes.values():
        cases *= value +1
    answer = cases -1
    return answer

원리는 같으나 Counter를 이용하니 훨씬 간단하다.

profile
life is fun

0개의 댓글