알고리즘(Python)

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

mingmaeng 2020. 1. 9. 10:49
문제

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

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

종류 이름

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

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

 

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

오랜만에 돌아왔다. 그동안 SOPT 앱잼 기간이어서 활동을 못했는데, 다시 활동을 재개하도록 하겠다.

오늘은 예전에 풀었던 알고리즘 문제를 들고 왔다. 이번에는 백준이 아니라 프로그래머스 문제다. 맨 처음 알고리즘의

'알'자도 몰랐던 내가 처음 알고리즘을 시작했던 사이트다. 이 당시에는 백준의 존재를 몰랐다고....

1 레벨 조차도 허우적거렸던 내가 지금은 2 ~ 3 레벨에서 놀고 있다. 엄청난 발전 아닌가?

 이번 문제는 2 레벨 문제이긴 하지만 간단하면서도 뇌를 말랑하게 해주는 문제다. 그동안 알고리즘으로 단단해진 뇌를 살짝 풀어주는 느낌의 문제라 인상 깊다.

의상을 조합하는 모든 경우의 수를 구하는 문제다. 모든 의류를 입는다고 가정하면 그냥 모든 의상 타입끼리 곱해서 결괏값을 보여주면 되지만, 이 스파이는 하루에 최소 한 개의 의상은 입는다는 조건이 붙어있다. 이러면 굉장히 머리가 아파진다. 그러나 걱정하지 마라. 이 문제는 정말 쉬우니까.

 

 문제를 푸는 방법은 조합이다. 그냥 모든 의상의 타입 개수끼리 곱해주면 된다. 단, 여기서 우리는 하나의 요소를 추가해 줄 것이다. 바로 아무것도 입지 않는다는 요소다!!

모든 조합에서 조건들을 정해 빼는 것보다 그냥 하나의 요소를 추가해서 조합해주는 게 더 편하다.

제시한 옷들에서 아무것도 입지 않음이라는 요소를 하나 더해서 생각한다.

위처럼 '아무것도 입지 않음'이라는 요소를 생각해 조합을 구하면 된다. 주의할 점은 스파이는 한 개 이상의 옷을 입고 있기 때문에 아무것도 입지 않은 전라 상태의 요소는 빼줘야 한다.

파이썬은 Counter를 이용하면 각 옷의 종류 개수를 빠르게 파악 가능하다.

 

from collections import Counter
def solution(clothes):
    answer = 1
    closet = Counter([ty for name,ty in clothes])
    for value in closet.values() :
        answer *= (value+1)
    return answer - 1

개인적으로 너무 어렵게 생각해서 스스로 함정에 빠진 느낌을 받은 문제다. 가끔은 간단하게 생각하면 쉽게 풀리는 문제들도 보면 리프레시도 되고 너무 좋다고 생각한다.