위장
문제 링크
문제 설명
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 | 이름 |
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해 주세요.
제한 조건
- clothes의 각 행은 [ 의상의 이름, 의상의 종류 ]로 이루어져 있습니다.
- 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
- 같은 이름을 가진 의상은 존재하지 않습니다.
- clothes의 모든 원소는 문자열로 이루어져 있습니다.
- 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_'로만 이루어져 있습니다.
- 스파이는 하루에 최소 한 개의 의상은 입습니다.
입출력 예
clothes | return |
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] | 5 |
[["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]] | 3 |
입출력 예 설명
입출력 예#1
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
입출력 예#2
face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.
1. crow_mask
2. blue_sunglasses
3. smoky_makeup
해결 과정
위장은 프로그래머스 해시 카테고리에 속해있는 문제이므로 해시를 활용한 방식으로 풀어보았습니다.
문제를 먼저 간단히 만들어보면 모든 경우의 수를 구하는 문제입니다. '경우의 수'는 각 경우를 다 곱해주면 구할 수 있습니다. 종류마다 아무것도 안 입는 경우가 있을 수 있어 +1을 해주었습니다. 그리고 조건에서 아무것도 안 입는 경우는 없다고 했으니 최종 결괏값에서 -1( 아무것도 입지 않은 경우 )을 해주었습니다.
즉, ( 모자의 수 + 1 ) x ( 안경의 수 + 1 ) x ( 신발의 수 + 1 ) - 1의 공식으로 해결 가능합니다.
1. 연산에 사용할 결괏값 1과 해시맵을 사용하기 위해 파이썬 딕셔너리를 선언해 줍니다.
2. 각 의상을 종류별로 해시맵에 담아줍니다. 해시맵에 담겨 있는 수량을 1씩 증가시켜 주며, 담겨있지 않은 경우는 get method를 이용해서 0을 담아줍니다.
3. 아래의 공식을 만들어 주기 위해 결괏값 변수를 종류들에 +1을 한 값을 곱해줍니다.
( 모자의 수 + 1 ) x ( 안경의 수 + 1 ) x ( 신발의 수 + 1 ) - 1
4. 위 공식을 완성하기 위해 구해진 결괏값에 -1을 한 뒤 반환해 줍니다.
제출 코드
def solution(clothes):
# 1. 결괏값과 해시맵 선언
result = 1
hash_map = dict()
# 2. 의상을 종류별로 구분하기
for wear, kind in clothes:
# 3. get method로 1씩 증가, 없다면 0 삽입
hash_map[kind] = hash_map.get(kind, 0) + 1
# 3. 모든 조합 계산하기( 입지 않는 경우 포함 )
for kind in hash_map:
result *= (hash_map[kind] + 1)
# 4. 아무종류의 옷도 입지 않는 경우를 제외한 값 반환
return result - 1
또 다른 풀이
from functools import reduce
from collections import Counter
def solution(clothes):
# 1. 의상 종류별 Counter를 만든다.
counter = Counter([kind for clothe, kind in clothes])
# 2. 모든 종류의 count + 1을 누적하여 곱해준다
result = reduce(lambda acc, cur: acc*(cur+1), counter.values(), 1) - 1
return result
해결한 원리는 비슷하지만 reduce와 counter 그리고 lambda를 활용하여 간결하고 깔끔하게 해결한 방법입니다.
'ALGORITHM > Programmers' 카테고리의 다른 글
[Python] 프로그래머스, 카펫 Lv.2 (feat.이차방정식, 근의 공식, 파이썬) (41) | 2023.04.10 |
---|---|
[Python] 프로그래머스, 추억 점수 Lv.1 (feat. zip, dictionary, 한 줄 코드, 파이썬) (23) | 2023.04.06 |
[Python] 프로그래머스, 피로도 Lv.2 (feat.permutations, 파이썬) (58) | 2023.03.30 |
[Python] 프로그래머스, 완주하지 못한 선수 Lv.1 (feat.for문, Hash, Counter, 파이썬) (52) | 2023.03.28 |
[Python] 프로그래머스, 전화번호 목록 Lv.2 (feat.HashMap, 해시, startswith, 파이썬) (35) | 2023.03.24 |