티스토리 뷰

https://school.programmers.co.kr/learn/courses/30/lessons/42578#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제설명 

코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다.

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

종류 이름

의상 종류

 - 코니는 각 종류별로 최대 1가지 의상만 착용할 수 있습니다. 예를 들어 위 예시의 경우 동그란 안경과 검정 선글라스를 동시에 착용할 수는 없습니다.
- 착용한 의상의 일부가 겹치더라도, 다른 의상이 겹치지 않거나, 혹은 의상을 추가로 더 착용한 경우에는 서로 다른 방법으로 옷을 착용한 것으로 계산합니다.
- 코니는 하루에 최소 한 개의 의상은 입습니다.
코니가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

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

 

입출력 예

 

접근 방법

 

1. clothes 리스트를 Dic 자료형을 이용하여, 의상별로 카운팅한다.

2.1 이때 의상이 한 종류일경우 Dic의 len을 리턴

2.2 만약 의상이 여러종류의 경우 해당 의상 count에 1을 더해 곱해준다. 

      그 이후 -1 해준다(하나도 착용하지 않은 경우의 수)

 

 

처음짠 정답 소스코드

더보기
def solution(clothes):
    answer = 0
    
    clothesDic = {}
    
    for clothe in clothes:
        if clothe[1] in clothesDic:
            clothesDic[clothe[1]] += 1
        else:
            clothesDic[clothe[1]] = 1

    if len(clothesDic.keys()) == 1:
        answer = len(clothes)
    else:
        total = 1
        for i in clothesDic.values():
            total *= (i+1)
            
        answer = total -1
    return answer

 

 

리펙터링 소스코드

더보기
from collections import defaultdict
def solution(clothes):
    answer = 1
    
    clothesDic = defaultdict(int)
    
    for clothe in clothes:
        clothesDic[clothe[1]] += 1

    for i in clothesDic.values():
        answer *= (i+1)

    answer -= 1

    return answer

 

 

알게된 것

Collections의 defaultDict Object를 사용하면 손쉽게 카운팅 할 수 있는것을 알게 되었다.

 

일반 Dict의 경우 비어있는 없는 값을 참조할 경우 KeyError를 호출하게 된다.

 

따라서 

 

    for clothe in clothes:
        if clothe[1] in clothesDic:
            clothesDic[clothe[1]] += 1
        else:
            clothesDic[clothe[1]] = 1

if문을 통해 의상이 Dict에 있는지 확인 후 1을 더해주었다.

 

하지만 Collections의 defaultDict를 사용하면 keyError를 뱉어내지 않는다.

 

When a letter is first encountered, it is missing from the mapping, so the default_factory function calls int() to supply a default count of zero. The increment operation then builds up the count for each letter.

The function int() which always returns zero is just a special case of constant functions. A faster and more flexible way to create constant functions is to use a lambda function which can supply any constant value (not just zero):

 

문자가 맨처음 발견되면 default_factory를 통해서 default 값인 0으로 초기화 해준다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함