문제
https://school.programmers.co.kr/learn/courses/30/lessons/72411
나의 풀이
combinations와 Counter를 사용하면 풀 수 있을 것 같다는 생각이 들었다.
나의 생각은 이랬다.
주문이 들어온 메뉴들에서 나올 수 있는 모든 조합을 구한 다음, 가장 많이 등장하는 조합을 찾아서 return 시키는 것이었다.
하지만 코드를 적으면서 이렇게 더럽게 적어도 되는 건가 싶은 생각이 들었다.
나에 대한 의심 속에서 적은 코드라 변수명도 엉망이고 그냥 전체적으로 엉망진창이다.
나의 코드
from itertools import combinations
from collections import Counter
def solution(orders, course):
lst = []
test = []
reps = []
result = []
for o in orders:
for c in course:
if len(o) >= c:
lst.append(list(combinations(o, c)))
for i in lst:
for k in i:
test.append(''.join(sorted(k)))
test = Counter(test)
sorted_test = sorted(test.items(), key=lambda x: x[1], reverse=True)
for c in course:
for s in sorted_test:
if len(s[0]) == c:
reps.append(s[1])
break
for i, c in enumerate(course):
for s in sorted_test:
if len(s[0]) == c and s[1] == reps[i] and s[1] >= 2:
result.append(s[0])
return(sorted(result))
결과
그런데 신기하게도 정답 처리를 받을 수 있었다.
다른 사람의 풀이
틀이 되는 알고리즘이 맞아서 정답 처리가 된 것 같기는 한데, 이런 코드로 정답 처리를 받기에는 양심에 찔려서 다른 분들의 코드를 살펴보았다.
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) ]
나의 알고리즘과 같지만 훨씬 깔끔한 코드이다.
나는 특히 course 수에 따른 조합 중 가장 많이 등장하는 조합을 구하는 데에 애를 먹었다. 이걸 구현하는 데에 리스트를 2개나 더 선언했다.
하지만, 이분의 코드를 보면 most_common 함수를 사용해서 '각 course에서 나타나는 조합의 최대 개수'를 구할 수 있도록 한다.
느낀점
문제를 이해하고 푸는 것도 중요하지만, 코드를 다른 사람들이 알아 보기 쉽도록 쓰는 것도 참 중요한 것 같다.
물론 아직 이해하고 푸는 것조차 힘겹지만 계속 하다보면 언젠가 성장해있지 않을까 싶다.