손님이 시킨 메뉴가 있다. ex) A,B,D // B,C,D // A,B,D,E
메뉴 항목이 2명 이상의 손님한테 중복될 때, course 해당하는 메뉴의 최대값을 추출하려고 한다.
course = [2,3] 이라면 메뉴가 2개 중복된 메뉴 중 최대로 많이 중복된 메뉴 / 3개 중복된 메뉴 중 최대로 많이 중복된 메뉴를 추출하는 것이다.
위의 예에서는 2개 중복은 A,B 가 2회 // B,D가 3회, // A,D가 2회 // 나머지 항목은 모두 1회 이므로 "BD"
를 결과에 추가한다.
3개 중복은 A,B,D가 유일하므로 "ABD"
를 결과에 추가한다.
그래서 결과는 ["ABD","BD"]
이다. ( 사전순으로 정렬하라 )
예시값
solution(["XYZ", "XWY", "WXA"],[2,3,4])
각 경우의 수를 모두 센다? -> combination
해당 값에 key에 대한 value를 추출한다? -> map
def convert(s):
result = ""
for x in s:
result +=x
return result
def solution(orders, course):
hash_map = dict()
s_arr = []
for order in orders:
for num in course:
c_arr = list(combinations(order,num))
for c in c_arr:
s_arr.append(convert(c))
s_arr 결과값
['XY', 'XZ', 'YZ', 'XYZ', 'XW', 'XY', 'WY', 'XWY', 'WX', 'WA', 'XA', 'WXA']
Combination을 하면 XY와 YX가 다르게 집계가 된다. 그래서 hash_map의 key값을 확인하기 전에, 정렬 후 넣어주어야 한다.
for s in s_arr:
temp_arr = []
for t in s:
temp_arr.append(t)
temp_arr.sort()
sub_s = ""
for t in temp_arr:
sub_s += t
if sub_s in hash_map:
hash_map[sub_s]+=1
else:
hash_map[sub_s]=1
hash_map 값
{'XY': 2, 'XZ': 1, 'YZ': 1, 'XYZ': 1, 'WX': 2, 'WY': 1, 'WXY': 1, 'AW': 1, 'AX': 1, 'AWX': 1}
각 길이에 따른 최대값을 추출한다.
for num in course:
max_value = 0
for s in hash_map:
if len(s)==num:
max_value = max(max_value,hash_map[s])
for s in hash_map:
if hash_map[s]==max_value and len(s)==num and hash_map[s]>=2:
result.append(s)
result.sort()
return result
만약 2개에 해당하는 메뉴를 추출한다고 하면 조합을 이용해서 구해야 하는데, 잘못 생각해서
for num in orders:
for i in range(len(arr)-1):
arr[i:i+num] # --> 추출된 단어
위와 같이 생각했다.
from itertools import combinations
def convert(s):
result = ""
for x in s:
result +=x
return result
def solution(orders, course):
hash_map = dict()
s_arr = []
for order in orders:
for num in course:
c_arr = list(combinations(order,num))
for c in c_arr:
s_arr.append(convert(c))
for s in s_arr:
temp_arr = []
for t in s:
temp_arr.append(t)
temp_arr.sort()
sub_s = ""
for t in temp_arr:
sub_s += t
if sub_s in hash_map:
hash_map[sub_s]+=1
else:
hash_map[sub_s]=1
result = []
for num in course:
max_value = 0
for s in hash_map:
if len(s)==num:
max_value = max(max_value,hash_map[s])
for s in hash_map:
if hash_map[s]==max_value and len(s)==num and hash_map[s]>=2:
result.append(s)
result.sort()
return result