본문 바로가기

Algorithms and Languages/알고리즘 파이썬 문제풀이

[Python/프로그래머스] 42578. 의상

문제 접근 및 공부 내용, 풀이는 모두 하단 코드에 "주석"으로 포함되어 있으니 참고해주세요.

문제 유형 보기

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

 

입력 : 코니의 의상들이 담긴 2차원 리스트 clothes

출력 : 서로 다른 옷의 조합의 수

 

clothes	return
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]	5
[["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]]	3

1차 풀이

# 1차 풀이
from collections import Counter
def solution(clothes):
    # 리스트의 2번째 요소만 추출한 리스트를 만들어, Counter 쓸 수도.
    clothes = [cloth[1] for cloth in clothes]
    counter = Counter(clothes)
    
    t = len(counter)
    if t == 1:
        a = list(counter.values())[0] # 그냥 a = counter.values() 하면 언패킹이 안됨
        return a
    if t == 2:
        a, b = counter.values()
        return a + b + a*b
    if t == 3:
        a, b, c = counter.values()
        return a + b + c + a*b + a*c + b*c + a*b*c
    if t == 4:
        a, b, c, d = counter.values()
        return a+b+c+d + a*b+a*c+a*d+b*c+b*d+c*d + a*b*c+a*b*d+a*c*d+b*c*d + a*b*c*d
     
        # 1111 -> 
        # 1 2 -> 1+2+ 1*2 = 5
        # 3 -> 3
        # 1 2 3 -> 1+2+3 + 1*2+1*3+2*3 + 1*2*3 ?
        # abcd -> a+b+c+d + a*b+a*c+a*d+b*c+b*d+c*d + 
        # a*b*c+a*b*d+a*c*d+b*c*d + a*b*c*d  

# 입력 : 코니의 의상들이 담긴 2차원 리스트 clothes
# 출력 : 서로 다른 옷의 조합의 수
# 딕셔너리로 풀 수 있어보이는데??

`채점 결과 : 오답 - 정확성: 46.4 합계: 46.4 / 100.0`

처음에 문제 설명을 봤을 땐 옷의 종류가 4가지까지만 가능한 줄 알았는데,

테스트케이스가 절반만 맞는 걸 봐선 옷의 종류가 5가지 이상도 가능한 것 같다.

⇒ 옷의 종류 가짓수와 무관하게 코드를 짜야겠다.

이를 위해 찾아보니, 해당 계산 수식이 (a+1)(b+1) … 식으로 일반화가 가능하다고 한다.

정답 보고 개선한 2차 풀이

# 2차 풀이(정답)
from collections import Counter
def solution(clothes):
    clothes = [cloth[1] for cloth in clothes]
    counter = Counter(clothes)
    # 여기까지가 내 기존 풀이
    
    # 여기서부터 정답 보고 개선한 풀이
    answer = 1
    for count in counter.values():
        answer *= (count + 1)
    return answer - 1 # 모두 안 입는 경우 제외

`채점 결과 : 정답`

내가 len()을 쓴 것과 달리, 그냥 for in 구문을 사용해, 옷의 종류(즉 딕셔너리의 키 개수)와 상관없이 유연하게 대응 가능한 코드가 되었다.

⇒ 막힐 땐 파이써닉한 아이디어들이 돌파구가 될 수 있다!