Programmers - 메뉴 리뉴얼

박재현·2022년 4월 18일
0

알고리즘 부수기

목록 보기
41/43
post-thumbnail

문제링크

나의 풀이

from itertools import combinations

def convertObj(order, courseItem, solObj):
    
    if len(order) < courseItem:
        return
    
    tmp = list(combinations(order, courseItem))
    for value in tmp:
        value = tuple(sorted(value))
        key = ""
        for k in range(courseItem):
            key += value[k]
        if key in solObj:
            solObj[key] += 1
        else:
            solObj[key] = 0
            
def solution(orders, course):
    result = []
    
    
    for i in range(len(orders)):
        orders[i] = list(orders[i])
    for courseItem in course:
        solObj = {}
        
        for order in orders:
            convertObj(order, courseItem, solObj)
        all_keys = solObj.keys()
        all_values = solObj.values()
        if len(all_keys) >= 2:
            mmax = max(all_values)
            if mmax > 0:
                for key, value in solObj.items():
                    if value == mmax:
                        result.append(key)
    result.sort()
            
    return result
  • 함수와 변수이름을 정하는데 시간이 많이 든다.
  • tuple, dictionary의 기본 api에 대해 익숙하지 않다.

다른 풀이

import collections
import itertools

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

    for course_size in course:
        order_combinations = []
        for order in orders:
            order_combinations += itertools.combinations(sorted(order), course_size)

        most_ordered = collections.Counter(order_combinations).most_common()
        result += [ k for k, v in most_ordered if v > 1 and v == most_ordered[0][1] ]

    return [ ''.join(v) for v in sorted(result) ]
  • 함수는 되도록 만들지 않는다.
  • 변수명을 지을 때 _를 사용하자.
  • tuple과 dictionary의 기본 api는 외워 놓는게 좋을 것 같다.

추가 정리

collctions 모듈의 Counter 클래스

collections.Counter를 이용한 카운팅

from collections import Counter

Counter('hello world') # Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

most_common()

데이터의 개수가 많은 순으로 정렬된 배열을 리턴하는 most_common() 메서드를 제공한다.

Counter('hello world').most_common() 
# [('l', 3), ('o', 2), ('h', 1), ('e', 1), (' ', 1), ('w', 1), ('r', 1), ('d', 1)]

이 메서드의 인자로 숫자 K를 넘기면 그 숫자만큼만 리턴하기 때문에, 가장 개수가 많은 K개의 데이터를 얻을 수도 있다.

Counter('hello world').most_common(1) # [('l', 3)]

리스트 표현식

리스트 표현식 for 문

  • List, Set, Dictionary 안에서 for문과 if문을 사용하여 컬렉션 내부의 원소들을 구성할 수 있다.
  • [item for item in iterable]이 기본 형식이다.
words = ['나는', '파이썬을', '공부하고', '있습니다.', '파이썬은', '무척', '심플하고', '명료합니다.']
[len(word) for word in words]
# [2, 4, 4, 5, 4, 2, 4, 6]

리스트 표현식 if문에 의한 필터링

  • 리스트 표현식을 단순히 for 문만이 아닌 if문을 더해서 이루어질 원소를 필터링 할 수 있다.
  • [item for item in iterable if 조건(item)]이 기본 형식이다.
[len(word) for word in words if len(word) > 3]
# [4, 4, 5, 4, 4, 6]
profile
공동의 성장을 추구하는 개발자

0개의 댓글