[프로그래머스] 위장

동현·2021년 1월 3일
0
post-thumbnail

1. 문제 설명

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

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

종류이름
상의파란색 티셔츠
하의청바지
겉옷긴 코트

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

2. 제한사항

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

3. 풀이 과정

def solution(clothes):
    a = {}
    for i in range (0, len(clothes)):
        if (clothes[i][1] not in a):
            a[clothes[i][1]] = 1
        else:
            a[clothes[i][1]] = a[clothes[i][1]] + 1

이런식으로 옷의 개수를 세서 옷의 종류-개수 쌍을 가지는 딕셔너리를 만드는 것까진 생각했었지만 한 종류의 옷만 입는 경우, 두 종류의 옷만 입는 경우 이런식으로 세는 것으로 만들다가 결국 포기하고 구글링을 통해 답을 알아냈다.

def solution(clothes):
    a = {}
    for i in range (0, len(clothes)):
        if (clothes[i][1] not in a):
            a[clothes[i][1]] = 1
        else:
            a[clothes[i][1]] = a[clothes[i][1]] + 1
    
    answer = 0
    for i in a.values():
        if answer == 0:
            answer += (i + 1)
        else:
            answer *= (i + 1)
    answer -= 1
    
    return answer

처음 이 풀이를 봤을때 어떻게 이런식으로 생각을 한거지라는 생각이 들었다. 답을 유도하는 과정은 생각보다 단순했다. 예를 들어 {'headgear': 2, 'eyewear': 1} 인 경우가 있다고 생각해보자.
모든 경우의 수를 따져보면, (headgear를 쓰는 경우의 수(2) + 안쓰는 경우의 수(1)) * (eyewear를 쓰는 경우의 수(1) + 안쓰는 경우의 수(1)) - (아무것도 안 쓰는 경우의 수(1)) = 5로 깔끔하게 나온다. 이런식으로 문제를 더 깔끔하게 풀기 위해서는 더욱 분발해야 겠다는 생각이 들었다.

4. 문제 링크

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

profile
https://github.com/DongChyeon

0개의 댓글