코딩한걸음
728x90
반응형

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명


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

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

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


제한사항


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


문제를 풀기위해 로직을 구성

 

딕셔너리 쓰면 될 듯. 제한사항에 같은 이름을 가진 의상은 존재하지 않는다고 하니

이름을 저장할 필요는 없어보인다. 어차피 이름이 중요한 것이 아니라서.

itertools의 permutations를 사용할까도 고민했지만 결국 조합열을 찾는것이 아닌 단순히

입을 수 있는 가짓수만 찾으면 돼서 필요없을것 같다.

 

 

clothes를 돌며 1번째 인덱스를 key로 하고 갯수만 딕셔너리에 저장

> 딕셔너리를 돌며 answer에 곱하기, 이 때 안입는 경우의 수도 추가

> answer에서 모든 의상을 안입는 경우의 수 빼주기

# 초기 코드
from collections import defaultdict
def solution(clothes):
    clothes_dict = defaultdict(int)
    for c in clothes:
        clothes_dict[c[1]] += 1
    answer = 1
    for c in clothes_dict:
        answer *= clothes_dict[c] + 1
    return answer - 1
# 0.01 ms

 

간단한 코드지만 가독성 면에서 개선이 가능해보인다.

 

defaultdict를 사용하지 않고 문제를 풀 수 있지 않을까?

> 인덱스나 key값을 쓰는 것 보다는 직접적인 값에 저장하는게 더 가독성 있어 보일듯

 

1차 수정 : 가독성 개선

# 1차 수정 : 가독성 개선
def solution(clothes):
    clothes_dict = {}
    for _, category in clothes:
        clothes_dict[category] = clothes_dict.get(category, 0) + 1
    answer = 1
    for count in clothes_dict.values():
        answer *= count + 1
    return answer - 1
# 0.01 ms

 

이렇게 하면 조금 더 읽기 쉬운 코드가 된다.

 

 

 

 

 

 

 

728x90
반응형
profile

코딩한걸음

@Joonyeol_Yoon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!