프로그래머스 - 의상 / 위장 (레벨2) 파이썬

응애개발자·2023년 6월 16일
0

파이썬 코테

목록 보기
7/11

예전엔 스파이가 위장하는 내용이었는데 지금은 코니가 매일 다른 조합으로 옷입는 내용으로 바뀐듯.
그래서 제목도 위장에서 의상으로 바뀜. 구글링해보니 전부 위장이라는 문제만 있어서 뭔가 했는데 막상 들어가보니 같은 문제더라...
암튼
문제자체는 간단합니다.
각 의상 카테고리별로 의상 개수만큼 가지수를 가지며 거기다가 각 카테고리마다 아예 안입는 경우 1가지도 더해서 곱해준다.(만약 eyewear(안경 및 선글라스등)가 3가지면 eyewear를 안쓰는 경우까지 포함해 총 4가지이다.)

처음엔 이걸 각 카테고리별로 갯수를 set 하나랑 리스트 두개로 뽑아내서 개수를 각각 저장하려 했으나..
뭔가 생각대로 되지않아 결국 구글링...

def solution(clothes):
        answer = 1
        hanger_dict = {}

        for clo in clothes :
                if clo[1] not in hanger_dict.keys() :
                        # 위장할 종류(clo[1])가 딕셔너리에 없으면
                        hanger_dict[ clo[1] ] = 1
                else :
                        # 위장할 종류(clo[1])가 딕셔너리에 이미 있으면
                        hanger_dict[ clo[1] ] += 1

        for key, value in hanger_dict.items() :
                answer *= ( value + 1 )
                # ( value : 위장하기 위해 입는 경우의 수 ) + ( 1 : 안 입는 경우 )
                # * : 여러 종류 옷들의 조합의 수를 구하기 위해 곱해준다

        answer -= 1
        # -1 : 모든 종류의 옷을 안 입는 경우도 count 되었으므로 빼준다

        return answer
        
# 출처 : https://129212.tistory.com/105

몇개를 봤는데 다 이런식이더라. 해시를 이용해 푸는 문제.
뭐만하면 일단 리스트랑 셋을 적용하려는 습관을 좀 바꿔야될듯.

풀이는 위에서 말한걸 그대로 딕셔너리로 적용해서 푸는식. 문제에선 딕셔너리긴 한데 사실 해시가 딕셔너리로 구현되어있다는점.
암튼
hanger_dict를 선언하고 거기에 종류별로 없으면 맨처음에 1을 넣어주고 있으면 1씩 더해준다.
그 다음 for문에서 answer에 각 종류별로 1씩 더하며 곱한다.

마지막에 return 하기전에 전부 안입었을때를 제거한다.(제약조건에 전부 안입는 경우는 없다고 나온다.)

0개의 댓글