녹k녹k
사진 출처: https://youtu.be/hh5KItacA-I?si=b7UUsEPTZZHrgDWJ
문제
답안
def solution(clothes):
answer = 1
c = dict()
# 종류 별로 옷 분류
for cloth in clothes:
if cloth[1] not in c: c[cloth[1]] = [cloth[0]]
else: c[cloth[1]].append(cloth[0])
c_num = [len(value)+1 for value in list(c.values())]
for c in c_num:
answer*=c
answer-=1
return answer
문제는 단순하게
- (input) clothes=[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]가 주어졌을 때, 매일매일 중복되지 않고 옷을 갈아입는 최대 경우의 수를 구하는 것입니다.
문제 풀이
1. 입력 값은 ['옷', '옷의 종류'] 이렇게 이루어져 있습니다. 1번 인덱스를 key로, 0번 인덱스를 value로 넣는 과정을 거치면, 아래와 같이 나눠집니다.
그리고 잠깐 이렇게 input이 주어졌을 때, 모든 경우의 수를 구해봅시다.
1. yellow_hat
2. green_turban
3. blue_sunglasses
4. yellow_hat+blue_sunglasses
5. green_turban+blue_sunglasses
이렇게 연산한 걸 잘 보면. 모든 경우의 수란 사실 종류 별로 나온 숫자를 +1(안 입음)한 값에 -1(아무 것도 안 입은 경우)을 하면 된다는 것을 알 수 있습니다.
+1을 하는 이유는 안 입었기 때문입니다.(어쨌든 하나만 입으면 되기 때문이죠)
- headgear- yellow_hat, green_turban +안 입음
- eyewear- blue_sunglasses +안 입음
-1을 하는 이유는 각 종류마다 안 입는 경우가 생기는데. 이걸 모두 곱해버리면 아무것도 안 입는 경우가 생겨나기 때문입니다.
2. 자 그럼 일단, 쓸데없는 문자열 제거합니다.
3. 그리고 해당 리스트 값들을 +1해주고 곱한 다음 -1을 해주면 끝입니다.
삽질 스토리
제가 푼 원본 코드입니다.
from itertools import combinations
def solution(clothes):
answer = 0
c = dict()
# 종류 별로 옷 분류
for cloth in clothes:
if cloth[1] not in c: c[cloth[1]] = [cloth[0]]
else: c[cloth[1]].append(cloth[0])
# 조합 구하기
# 어차피 문자열은 필요없고 몇 개 있는지 알면 됨
c_num = [len(value) for value in list(c.values())]
answer+=sum(c_num) # 1개씩만 입을 경우
for i in range(2, len(list(c.keys()))+1): # 몇 종류인지? i개만큼 조합함
combis = list(combinations(c_num, i)) # i개 만큼의 조합을 구함
for combi in combis:
result = 1
for com in combi: result*=com
answer += result
return answer
이 코드는 다음과 같이 작동합니다.
1. 옷을 종류 별로 딕셔너리에 넣음
2. 1종류만 입는 경우를 answer에 더함
3. n개의 종류를 섞어 입는 경우(조합)를 answer에 더함
- 현재 c_num은 각 종류 별 옷이 몇 개 있는지에 관한 1차원 배열임
- 예를 들어 모자 2종류, 선글라스 3종류, 상의 4종류 있으면 [2,3,4]로 되있음
- c_num과 2개의 종류를 섞어 입는 모든 조합을 구하면 [2,3], [2,4], [3,4] 이렇게 나옴
- 저렇게 나온 건 서로 곱해서 answer에 더해주면 됨
사실 친구랑 코딩 스터디 중이라서 푼 건 좀 있는데. 풀기에 급급해서 올리지 못하고 잇네요. 이번주 제가 휴가 신청해서 팀원 분이 승인해줬답니다. 열심히 푼 거 올릴게요.
안녕히게세요
'python > 백준_프로그래머스' 카테고리의 다른 글
[프로그래머스] 완전 탐색-모음 사전. 근데 이제 수학을 곁들인 (0) | 2023.09.17 |
---|---|
[백준 1100번] 하얀 칸 python과 eval 함수 (4) | 2022.02.04 |
[백준 2039번] 일곱 난쟁이 python과 combinations (0) | 2022.02.03 |
[백준 1026번] 보물 python과 리스트 정리 (0) | 2022.02.02 |
[백준 11047번] 동전0(그리디 알고리즘) python (0) | 2022.01.05 |