코딩 다이어리
[Programmers] 위장(Level. 2) 본문
문제설명
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을 빼준다.
'알고리즘 > Programmers' 카테고리의 다른 글
[Programmers] 삼총사(Level. 1) (2) | 2022.12.04 |
---|---|
[Programmers] 기사단원의 무기(Level. 1) (1) | 2022.11.29 |
[Programmers] 문자열 다루기 기본(Level. 1) (1) | 2022.11.28 |
[Programmers] 콜라문제(Level. 1) (0) | 2022.11.26 |
[Programmers] 팩토리얼(Level. 0) (1) | 2022.11.26 |