새소식

⌨️ Algorithms/프로그래머스

[Python] 프로그래머스 Lv2_위장

2022. 12. 26. 23:55

  • -

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

 

프로그래머스

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

programmers.co.kr

 

  • 스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장
  • clothes: 스파이가 가진 의상들이 담긴 2차원 배열
  • 서로 다른 옷의 조합의 수를 return

제한사항

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있음
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하
  • 같은 이름을 가진 의상은 존재하지 않음
  • clothes의 모든 원소는 문자열로 이루어져 있음
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있음
  • 스파이는 하루에 최소 한 개의 의상은 입음

 

"""
입출력 예시)

clothes = [["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] -> 5
clothes = [["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]] -> 3 
"""

 

# clothes = [["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] -> 5

# headgear에 해당하는 의상: yellow_hat, green_turban
# eyewear에 해당하는 의상: blue_sunglasses

# => 가능한 조합: 5가지
# 1. yellow_hat
# 2. blue_sunglasses
# 3. green_turban
# 4. yellow_hat + blue_sunglasses
# 5. green_turban + blue_sunglasses
# clothes = [["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]] -> 3

# face에 해당하는 의상: crow_mask, blue_sunglasses, smoky_makeup

# => 가능한 조합: 3가지
# 1. crow_mask
# 2. blue_sunglasses
# 3. smoky_makeup

 

 

## 의사코드 ##

# clothes의 각 행은 [의상의 이름, 의상의 종류]
# -> 해시를 dict로 생성해서 key: 의상 종류, value: 의상 이름

# 하루에 딱 하나의 의상을 입는 경우부터 세는 거니까 모든 경우의 수 구하기
# 모든 의상 종류를 안 입는 경우인 한 가지 빼기

 

 

통과한 코드

 

from collections import defaultdict

def solution(clothes):
    answer = 1
    closet = defaultdict(list) # 해시 생성

    # 해시에 데이터 삽입 -> {의상 종류: [의상 이름1, 의상 이름2, ...], 의상 종류: [의상 이름1, 의상 이름2, ...], ...}
    for name, category in clothes:
        closet[category].append(name)

    # 조합 구하기
    for k in closet.keys():
        answer = answer * (len(closet[k]) + 1) # 의상 종류별로 (의상의 개수 + 1)을 곱해서 모든 경우의 수를 구함

    return answer - 1 # 모두 안 입는 경우는 빼기

-> defaultdict를 활용해서 key가 중복되는 경우, value 값을 리스트로 추가함

 

  • defaultdict()
    • dict type의 값에 기본 값을 지정
    • 신규 값 생성 시 사용하는 방법
from collections import defaultdict

 

 

  • 그냥 dict에 key: 의상 종류, value: 의상 이름을 넣는 경우 
clothes = [["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]
h = dict()

for c in clothes:
    h[c[1]] = c[0]
    print(h)
    
"""
{'headgear': 'yellow_hat'}
{'headgear': 'yellow_hat', 'eyewear': 'blue_sunglasses'}
{'headgear': 'green_turban', 'eyewear': 'blue_sunglasses'}
"""

-> key 값인 의상 종류가 중복되면 나중에 추가된 원소만 남음

 

 

  • 같은 key 값을 가진 value가 여러 개일 때 value를 list로 추가하는 방법
    • defaultdict() 활용 
    • defaultdict 없이 dict의 value에 list 추가
# defaultdict 활용

clothes = [["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]

from collections import defaultdict
closet = defaultdict(list)

for name, category in clothes:
    closet[category].append(name)

print(closet)

"""
defaultdict(, {'headgear': ['yellow_hat', 'green_turban'], 'eyewear': ['blue_sunglasses']})
"""
# defaultdict 없이 value에 리스트 추가

clothes = [["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]

closet = dict()

for name, category in clothes:
    if category in closet:
        closet[category].append(name)
    else:
        closet[category] = [name]

print(closet)

"""
{'headgear': ['yellow_hat', 'green_turban'], 'eyewear': ['blue_sunglasses']}
"""

 

 

 

 참고) 

 

https://velog.io/@hellokena/%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC-value-%EC%97%AC%EB%9F%AC%EA%B0%9C-%EC%B6%94%EA%B0%80

 

딕셔너리 value 여러개 추가

key=operator.itemgetter(1)key값으로 sortsorted(dic.items(), key=lambda x:x1) 출처: https://ebbnflow.tistory.com/306 삶은 확률의 구름

velog.io

 

https://coding-grandpa.tistory.com/88

 

[프로그래머스] 위장 (해시 Lv. 2) - 파이썬 Python

0. 동일 유형 문제 [프로그래머스] 완주하지 못한 선수 (해시 Lv. 1) [프로그래머스] 전화번호 목록 (해시 Lv. 2) [프로그래머스] 위장 (해시 Lv. 2) [프로그래머스] 베스트 앨범 (해시 Lv. 3) 1. 문제 설명

coding-grandpa.tistory.com

 

https://velog.io/@devjuun_s/%EC%9C%84%EC%9E%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4

 

위장-프로그래머스(python)

문제 출처 : 프로그래머스-위장 문제설명 스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다. 예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색

velog.io

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!