-
프로그래머스. 메뉴 리뉴얼 파이썬 풀이IT/알고리즘 해설 2021. 10. 22. 18:49728x90SMALL
해설
이 문제는 모든 조합을 다 구한 뒤, 조합들 중에 가장 최선인 답을 도출하는 문제다.
파이썬으로 엄청 간단하게 풀 수 있다.
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로 접근 잘만했는데 왜 나만 안되는 건지 궁금하다...
아무튼 문제 자체는 굉장히 간단한 문제여서,
뭔가 더 쉽게 풀 수 있는게 있을까 짱구를 굴려봤는데 이게 최선인 것 같다 ㅋㅋ
728x90LIST'IT > 알고리즘 해설' 카테고리의 다른 글
백준. 11047 동전0 | 파이썬, 그리디 알고리즘 (0) 2021.10.28 백준 1707. 이분 그래프 (파이썬) (0) 2021.10.08 프로그래머스. 2021 KAKAO BLIND RECRUITMENT. 신규 아이디 추천(파이썬) (0) 2021.09.29 백준 1038. 감소하는 수 (파이썬) (0) 2021.09.23 프로그래머스 2020 카카오 인턴 - 키패드 누르기 해설 (파이썬) (0) 2021.09.14