ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스. 메뉴 리뉴얼 파이썬 풀이
    IT/알고리즘 해설 2021. 10. 22. 18:49
    728x90
    SMALL

    해설

     

    이 문제는 모든 조합을 다 구한 뒤, 조합들 중에 가장 최선인 답을 도출하는 문제다.

    파이썬으로 엄청 간단하게 풀 수 있다.

     

    from itertools import combinations
    from collections import Counter
    
    def solution(orders, course):
        answer = []
        
        for c in course:
            t = []
            for o in orders:
                com = combinations(sorted(o), c)
                t.extend(com)
            
            count = Counter(t).most_common()
            
            max = -1
            for c in count:
                if c[1] >= max and c[1] > 1:
                    max = c[1]
                    answer.append("".join(c[0]))
                else:
                    break
                    
            
        return sorted(answer)

     

    파이썬에서 조합과 관련된 문제는 거의 다 간단하게 풀 수 있다.

    combinations 라는 깡패같은 함수가 있어서, 이 함수가 모든 조합을 다 구해준다.

    combinations(조합을 구할 iterator, 개수) 로 함수를 호출해주면 해당 개수로 만들어질 수 있는 모든 조합을 다 리턴한다.

    예를 들어, "ABCFG"의 경우 "AB", "AC", "AF", "AG" 등등 을 전부 다 만들어서 리턴해준다.

    이 함수가 없었더라면.... 아마 모든 경우를 다 구해야 했을건데, 역시 갓-언어 파이썬.

     

    course, 그러니까 단품의 개수에 따라서 combinations로 모든 조합을 만들어준 뒤,

    임시 리스트에 모든 조합을 다 넣어준다.

    그 후에 Counter를 사용해서 리스트에 있는 요소의 개수를 센다. 즉 한 요소가 해당 리스트에 몇개나 있는지 세준다.

    most_common()을 이용하면 개수가 가장 많은 것부터 리턴해준다.

     

    그 후에, most_common()으로 구한 개수를 기준으로 max개인 것들만 answer에 넣어주면 끝이다.

    answer에는 사전 순서대로 정렬해서 들어가 있어야 하므로, sorted로 정렬을 해서 return해주면 끝~

     

    매우 간단한 문제였다.

    근데 대체 왜 프로그래머스 에디터에서 most_common()으로 구한 list에 index로 접근을 못하는지 모르겠다.

    위 코드에서 count 변수에 iterator가 들어가니까, count[0][1] 이런식으로 접근할 수 있을 줄 알았는데,

    그렇게 접근하면 list index out of range 에러가 뜨면서 접근이 안된다.

    다 풀고 다른 사람 풀이를 보는데, 다른 사람들은 index로 접근 잘만했는데 왜 나만 안되는 건지 궁금하다...

     

    아무튼 문제 자체는 굉장히 간단한 문제여서,

    뭔가 더 쉽게 풀 수 있는게 있을까 짱구를 굴려봤는데 이게 최선인 것 같다 ㅋㅋ

     

    728x90
    LIST

    댓글

Designed by Tistory.