만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/programmers&bj

[python] 메뉴 리뉴얼

D36choi 2022. 3. 13. 17:17
728x90

from itertools import combinations
from collections import Counter

def solution(orders, course):
    answer = []

    for i, o in enumerate(orders):
        orders[i] = ''.join(sorted(o))

    for courseLen in course:
        comb_list = []
        for ord in orders:
            order_list = list(ord)
            comb_list += list(combinations(order_list, courseLen))

        commons = Counter(comb_list).most_common()
        answer += [''.join(k) for k,v in commons if commons[0][1] == v and v > 1]
    return sorted(answer)

문제

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

내 풀이

from collections import defaultdict
from itertools import combinations


def solution(orders, course):
    answer = []
    courses = defaultdict(lambda: 0)

    for i, o in enumerate(orders):
        orders[i] = ''.join(sorted(o))

    for courseLen in course:
        for ord in orders:
            orderList = list(ord)
            possibleList = list(combinations(orderList, courseLen))
            for c in possibleList:
                courses[''.join(c)] += 1

        items = courses.items()
        max_count = max(items, key=lambda k: k[1])

        if max_count[1] <= 1:
            continue
        for item in items:
            if max_count[1] == item[1]:
                answer.append(item[0])
        courses.clear()
    answer.sort()
    return answer


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    solution(["ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"], [2, 3, 4])

알게 된 것

1. Counter 클래스를 사용하면, Map으로 카운팅할 필요가 없어진다

2. list += list 를 하면 list가 append된다

3. 간만에 파이썬하려니 다까먹었다

4. ''.join 기억하자

5. itertools를 미리 공부해두자

6. defaultdict 의 람다식을 기억해두자 인자는 필요없다

courses = defaultdict(lambda: 0)

피드백

from itertools import combinations
from collections import Counter

def solution(orders, course):
    answer = []

    for i, o in enumerate(orders):
        orders[i] = ''.join(sorted(o))

    for courseLen in course:
        comb_list = []
        for ord in orders:
            order_list = list(ord)
            comb_list += list(combinations(order_list, courseLen))

        commons = Counter(comb_list).most_common()
        answer += [''.join(k) for k,v in commons if commons[0][1] == v and v > 1]
    return sorted(answer)

Counter(collection).most_common() 은 key, counter tuple의 list를 리턴한다.

 counter value 기준으로 내림차순 정렬된다 (그게 most_common의 정의)

 

sorted 는 배열에만, 문자열 자체를 정렬할땐 sorted()를 쓰자

 

 

 

'프로그래밍 > programmers&bj' 카테고리의 다른 글

[python] k진수에서 소수 개수 구하기  (0) 2022.03.22
[JAVA] 뉴스 클러스터링  (0) 2022.03.18
[JAVA] 카카오프렌즈 컬러링북  (0) 2022.03.06
[JAVA] 문자열 압축  (0) 2022.02.21
[JAVA] K번째 수  (0) 2022.02.10