[ Programmers / CodingTest / Python ] 위장

황승환·2022년 1월 19일
0

Python

목록 보기
107/498

문제 설명

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

종류	이름
얼굴	동그란 안경, 검정 선글라스
상의	파란색 티셔츠
하의	청바지
겉옷	긴 코트

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

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

입출력 예

clothes												return
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]	5
[["crowmask", "face"], ["bluesunglasses", "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

접근 방법

우선 이 문제에서는 의상의 이름은 사실 중요하지 않다. 각 의상의 종류가 몇개씩 있는지만 파악하면 해결할 수 있다. 만약 모자 2개, 상의 1개라고 하면 경우는 5가지로 나타낼 수 있다.

모자 x 상의 1
모자 1 상의 x
모자 1 상의 1
모자 2 상의 x
모자 2 상의 1

이를 통해서 나는 (모자의 개수+1)\*(상의의 개수+1)-1이라는 식을 구할 수 있었다. 이제 clothes라는 배열을 의상 종류 이름: 개수로 나타내면 모든 경우의 수를 쉽게 구할 수 있다. 이를 위해서 딕셔너리를 공부하다가 배웠던 defaultdict()를 이용했다. defaultdict()는 조회의 경우 주어진 key값에 해당하는 value가 없을 경우에 value에 기본값을 넣어 바로 생성해주는 딕셔너리이다. 파이썬 3부터 지원되는 점을 기억해야 한다. defaultdict()에 key를 의상 종류 이름으로 설정하고 value를 개수로 설정하여 clothes 배열을 딕셔너리로 변경한다. 그리고 도출된 딕셔너리의 value에 1을 더한 값을 모두 곱하고 마지막에 1을 빼주면 해결할 수 있다.

  • 정답을 저장할 변수 answer를 1로 정의한다.
    (모든 경우의 수를 구하기 위해 answer에 다른 값들을 곱해야 하므로 1로 정의한다.)
  • clothes를 의상 종류 이름: 개수의 형태로 저장할 딕셔너리 c_list를 defaultdict()로 정의한다. defaultdict()의 인자로 int를 넣어 기본 값이 0이 되도록 한다.
  • clothes를 순회하는 i, j에 대한 for문을 돌린다.
    -> c_list[j]를 1 증가시킨다.
  • c_list를 순회하는 i, j에 대한 for문을 돌린다.
    -> answer에 j+1을 곱한다.
  • answer에서 1을 빼준다.
  • answer를 반환한다.

solution.py

from collections import defaultdict
def solution(clothes):
    answer = 1
    c_list=defaultdict(int)
    for i, j in clothes:
        c_list[j]+=1
    for i, j in c_list.items():
        answer*=(j+1)
    answer-=1
    return answer

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

1개의 댓글

comment-user-thumbnail
2022년 1월 19일

오늘도 좋은하루~ 심심하면 준찌닷컴? 궁금하면 ㄱㄱ🔞
https://junjjijji.com/

답글 달기