python/백준_프로그래머스

[프로그래머스] 해시-의상 (python) 눈물나는 삽질쇼

소곡이 2023. 9. 5. 16:18
728x90

 

 

 

녹k녹k

뭐..뭐야 시..ㅅ.바!!!!
제목 낚시아닙니다. 제발 나가지 마세요 엉엉

 

사진 출처: https://youtu.be/hh5KItacA-I?si=b7UUsEPTZZHrgDWJ


 문제

 

 

프로그래머스

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

programmers.co.kr

 

 

답안
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에 더해주면 됨

 

물론 시간 초과지롱


사실 친구랑 코딩 스터디 중이라서 푼 건 좀 있는데. 풀기에 급급해서 올리지 못하고 잇네요. 이번주 제가 휴가 신청해서 팀원 분이 승인해줬답니다. 열심히 푼 거 올릴게요. 

 

안녕히게세요