코딩 다이어리

[Programmers] 위장(Level. 2) 본문

알고리즘/Programmers

[Programmers] 위장(Level. 2)

yc7764 2022. 11. 28. 16:35

문제설명

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

 

프로그래머스

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

programmers.co.kr

 

문제풀이

제출코드

def solution(clothes):
    answer = 0
    result = 1
    dict = {}
    for i in clothes:
        if(i[1] in dict):
            dict[i[1]] = dict[i[1]] + 1
        else:
            dict[i[1]] = 2
    for i in dict.keys():
        result = result * dict[i]
    answer = result - 1
    return answer
  • 서로 다른 옷을 입을 경우의 수를 구하기 위해 가장 먼저 첫 번째 for문에서 의상의 종류별로 의상의 이름 수를 세고 dict에 저장하였다. 이때 새로운 의상 종류로 입력이 들어오면 입는 경우와 입지 않는 경우가 있으므로 2로 초기화를 해주었다. 만약 입력이 [["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]]일 경우 dict의 key는 "face"만 존재하며 dict["face"] = 4이다.
  • 다음으로 각 의상 종류별 가지수가 저장된 dict를 이용해 총 경우의 수를 구한다. dict.keys() 메소드로 모든 의상 종류의 이름을 가져오고 dict[i]로 해당 종류의 의상 수를 result에 곱하며 총 경우의 수를 구했다. 마지막으로 dict에는 해당 종류 의상을 입지 않는 경우도 포함되었고 반드시 하나 이상의 의상을 입어야하므로 모든 의상을 입지 않는 경우의 수를 빼주었다.

다른 사람의 풀이

def solution(clothes):
    from collections import Counter
    from functools import reduce
    cnt = Counter([kind for name, kind in clothes])
    answer = reduce(lambda x, y: x*(y+1), cnt.values(), 1) - 1
    return answer
  • collections 패키기의 Counter 클래스와 functools 패키지의 reduce 메소드를 활용하여 푼 풀이로 Counter 클래스로 입력으로 들어온 clothes에서 중복된 데이터 수를 확인하고 각 kind가 몇 번씩 나왔는지를 cnt에 저장하였다. 또한 reduce()메소드를 활용해 초기값 1부터 시작하여 루프를 돌며 cnt에 저장된 각 의상 종류의 가지수를 곱해주며 누적값을 구하고 있다. 이때 마찬가지로 해당 의상 종류를 입지 않은 경우를 포함해야 하므로 1을 더해준다(y+1). 마지막으로 모든 의상을 입지 않은 경우를 빼주기 위해 answer에 1을 빼준다.
Comments