[Python] 위장 - 해시

Saemi Min·2023년 2월 9일
0

Programmers Algorithm

목록 보기
10/29
post-thumbnail

문제

해당 문제 링크

풀이

def solution(clothes):
    closet={}
    result=1

    for element in clothes:
        key=element[1]
        value=element[0]
        if key in closet:
            closet[key].append(value)
        else:
            closet[key]=[value]
            
        print(closet)
        
    
    for key in closet.keys():
        result=result * (len(closet[key]) +1)
    
    
    return result-1

Git - 소스 코드

결과

다른 사람 코드

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

람다식 lambda :

reduce()
"from functools import reduce"
기본적으로 초기값을 기준으로 데이터를 루프 돌면서 집계 함수를 계속해서 적용하면서 데이터를 누적하는 방식으로 작동

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

여기서, 집계 함수는 두개의 인자를 받아야 하는데, 첫번째 인자는 누적자(accumulator), 두번째 인자는 현재값(current value)가 넘어오게 된다. 누적자는 함수 실행의 시작부터 끝까지 계속해서 재사용되는 값이고, 현재값은 루프 돌면서 계속해서 바뀌는 값이다.
참고 사이트

해석

어떻게 접근해서 구현해야겠다라는 생각은 들었지만 어떻게 작성해야할지가 어려웠다.. 다른 사람의 코드를 참고하여 문제를 풀어본 결과 위와 같은 풀이 코드가 나왔다.

아래 for문에서 result=result * (len(closet[key]) +1)의 식에 대해 해석해보자!
len(closet[key])에 +1을 해주는 이유는 착용하지 않은 경우의 수를 넣어준 것이다.
반환할 때는 result에 -1을 해주는 이유는 최소 한 개의 의상은 착용하기 때문에 하나도 착용하지 않은 경우의 수를 제외시키기 위함이다.

코드 해석은 쉽게 되었다.
하지만 직접 코드를 작성하는데에 딕셔너리에 아직 익숙하지 않았다. 딕셔너리를 쓰는 문제를 많이 풀어봐야 할 것 같다. 이후에 이 문제는 다시 풀어볼 예정이다.

profile
I believe in myself.

0개의 댓글