1 min to read Algo-and-DS
[프로그래머스] 해시, 위장
머리에 기름칠 좀 할 겸,
매일 한 시간씩 프로그래머스에서 제공하는 코딩 테스트 연습문제를 풀고 있다.
주소: https://programmers.co.kr/learn/courses/30/parts/12077
오늘 푼 문제는 해시 문제
내 풀이
from collections import Counter
def solution(clothes):
result = Counter()
for c in clothes:
result += Counter([c[1]])
answer = 1
for e in list(result.values()):
answer *= (e+1)
return answer - 1
못 풀어서 다른 사람 풀이 댓글에
(각 의상 수 + 1)을 모두 곱하고 -1
하면 답이라는 걸 알았다.
이를테면, 모자 2개 신발 1개 바지 3개 이면,
경우의 수는 (2+1) * (1+1) * (3+1) - 1
그 아이디어로 코드는 직접 짜 봤다.
Counter()
파라미터로 String 값만 넣으면 문자 단위로 쪼개지므로
Counter([c[1]])
이 된 것. (단어 단위로 쪼개져야 하니깐)
가장 추천수가 높은 풀이
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
함수형 프로그래밍의 fold
개념으로 접근한 풀이
fold
재귀적인 자료구조를 분석, 주어진 결합 동작을 사용해
원 자료구조의 부분 구조를 반복적 처리 및 재결합해서 하나의 결괏값으로 반환하는 함수 집합
-Wikipedia
functools 모듈의 reduce()
가 그것이다.