문제 접근 및 공부 내용, 풀이는 모두 하단 코드에 "주석"으로 포함되어 있으니 참고해주세요.
문제 유형 보기
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 구문을 사용해, 옷의 종류(즉 딕셔너리의 키 개수)와 상관없이 유연하게 대응 가능한 코드가 되었다.
⇒ 막힐 땐 파이써닉한 아이디어들이 돌파구가 될 수 있다!
'Algorithms and Languages > 알고리즘 파이썬 문제풀이' 카테고리의 다른 글
[Python/DailyAlgo] 79. 배열 정렬 (0) | 2025.02.04 |
---|---|
[Python/프로그래머스] 121683. 외톨이 알파벳 (0) | 2025.02.04 |
[Python/프로그래머스] 42576. 완주하지 못한 선수 (0) | 2025.02.04 |
[Python/프로그래머스] 81301. 숫자 문자열과 영단어 (0) | 2025.02.04 |
[Python/백준] 2798. 블랙잭 (0) | 2025.02.04 |