#6 위장:

date posted: 2020-04-19




오늘의 TMI

  1. 블로그 자주하면 TMI 쓸게 별로 없는듯. => 천천히 해야겠네
  2. 다음주 강릉여행 가려고함, 무계획으로 그냥 이곳저곳 걸을생각...



코딩 풀이 시작

문제 설명은 아래 프로그래머스 링크에서 보세요.

#1 시도
  • 이름만 hashmap 이지 사실상 그냥 dictionary...
  • list 형태로 옷 이름은 넣어줌.
  • 종류가 이미 있으면 그 hashmap[종류] 로 이미 있는 [이름] 을 불러 새로운 이름을 넣어줌 -> [이름, 이름]
  • 각 종류마다 몇개있는지 확인
    • 한가지만 착용할수 있기에 각 종류마다 갯수를 더해줌
    • 종류가 다른게 있으면 조합을 할수 있으므로 곱하기 해줌. ex: 2얼굴 x 1상의 -> (1얼굴 1상의), (2얼굴 1상의) 2개의 조합 가능.
import numpy as np

def solution(clothes):
    hashmap = {}
    
    for c in clothes:
        if c[1] in hashmap:
            hashmap[c[1]].append(c[0])
        else:
            hashmap[c[1]] = [c[0]]
            
    count_per_group = [len(value) for value in hashmap.values()]
    multiplied = np.prod(count_per_group) if len(count_per_group) > 1 else 0 
    return sum(count_per_group) + multiplied
  • 고쳐야할 부분
    ex: clothes = [["yellow_hat", "headgear"], ["sung", "eyewear"], ["tshirt", "top"]] 이렇게 있을경우:
    • 각 종류당 하나씩 있기때문 = 3
    • (yellow_hat, sung), (yellow_hat, tshirt), (sung, tshirt) 이런식으로 3개 더 추가.
#2 시도
  • 종류별 조합의수는 = len(종류1) * len(종류2) *... *len(종류n) 으로 가능.
  • 종류가 안들어 갈수도 있다. ex: clothes = [["yellow_hat", "headgear"], ["sung", "eyewear"], ["tshirt", "top"]] 이렇게 있을경우:
    • ("yellow_hat"), ("sung"), ("tshirt"), ("sung", "tshirt"), etc.. 이런식으로 3개의 종류가 있더라도 하나만 사용할수 있고 2개만 사용할수 있다.
  • 서로 착용 안되는 경우의 수도 포함 해줘야기 때문에 len(종류) + 1 를 해준다.
  • 위에는 모든 종류를 아무것도 안입을경우까지 카운트 해주는데 그럴필요 없기에 전체수 - 1 을 해주면 끝.
import numpy as np

def solution(clothes):
    hashmap = {}
    for c in clothes:
        if c[1] in hashmap:
            hashmap[c[1]].append(c[0])
        else:
            hashmap[c[1]] = [c[0]]
    count_per_group = [len(value) for value in hashmap.values()]  
    return np.prod([c+1 for c in count_per_group]) -1
  • 성공하긴 했지만... 코드가 쫌 더러운 느낌?
  • 굳이 hashmap 의 value를 list 로 만든후에 다시 len(list) 할필요가 없을듯.
#3 시도
  • 여전히 더럽긴 하지만 마지막 loop comprehension 을 없앴기때문에 성능 개선.
import numpy as np

def solution(clothes):
    hashmap = {}
    for c in clothes:
        if c[1] in hashmap:
            hashmap[c[1]] = hashmap[c[1]] + 1
        else:
            hashmap[c[1]] = 1
            
    count_per_group = list(hashmap.values()) 
    return np.prod([c+1 for c in count_per_group]) -1
#4 시도
  • Counter 를 사용해서 hashmap 을 만들어놓으면 훨씬 깔끔.
  • [cat for name, cat in [[name,cat], [name2,cat2]] ] --> 밖에 리스트를 돌면서 안에 두값을 name, cat 에 넣어줌 --> 거기서 cat 만 사용하여 Counter dicionary 만들어줌.
import numpy as np
from collections import Counter

def solution(clothes):
    hashmap = Counter([cat for name,cat in clothes])       
    count_per_group = list(hashmap.values()) 
    return np.prod([c+1 for c in count_per_group]) -1
  • Counter 를 이렇게 쓸수있는지는 몰랐네요 아래의 링크르 보고 한수 배워왔습니다.