[Programmers] 메뉴 리뉴얼

Updated:

메뉴 리뉴얼

메뉴 리뉴얼 을 클릭하면 바로 이동한다.

손님들이 주문한 메뉴를 가지고 조합을 만들고 나서 가장 많이 주문된 조합을 반환하면 된다.

문제를 풀고 나니 시간 초과가 발생해 고칠 수 있는 부분은 죄다 고쳐봤는데 통과를 하지 못했다.

진짜 더 이상 줄일 게 없다고 생각했는데 조합을 구하는 부분에서 문제가 있었다.

처음 문제를 풀 때는 조합을 손님이 주문한 메뉴를 모두 모아 그 상태에서 조합을 만들었다.

이렇게 되면 만들 수 없는 조합이더라도 일단 반복문을 돌아 시간 초과가 발생한다.

예를 들어 [A, B, C, D], [E, F, G, H] 라는 주문이 두 개 들어왔다고 해보자.

손님이 주문한 메뉴를 모두 모아 길이가 2인 조합을 만들게 되면

[A, B, C, D, E, F, G, H] 를 가지고 조합을 만들기 때문에 [A, E], [C, H] 같이 실제로는 만들 수 없는 조합이 생긴다.

이런 필요 없는 조합을 만들지 않기 위해서 주문 표를 반복하면서 조합을 만들었다.

메뉴 조합을 다 만들고 나서 주문이 두 번 이상 됐고 가장 많이 주문된 조합을 코스요리로 넣으면 된다.

추가로 집합이 어떤 집합의 부분집합임을 확인하고 싶으면 차집합을 이용하기보다 issubset 메소드를 사용하는 게 5배가량 빠르다.


from itertools import combinations


def solution(orders, course):
	answer = list()

	for i in course:
		max_order_cnt = 0
		course_list = list()
		comb_list = list()
		
		for order in orders:
			comb_list.append(list(combinations(order, i)))

		comb_list = set(sum(comb_list, []))
		for val in comb_list:
			order_cnt = 0
			comb_food = set(val)

			for order in orders:
				if set.issubset(comb_food, order):
					order_cnt += 1

			if order_cnt >= 2:
				if max_order_cnt < order_cnt:
					course_list = [''.join(sorted(comb_food))]
					max_order_cnt = order_cnt
				elif max_order_cnt == order_cnt:
					course_list.append(''.join(sorted(comb_food)))

		answer += course_list

	return sorted(answer)


if __name__ == '__main__':
	orders = ["ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"]
	course = [2, 3, 4]

	print(solution(orders, course))

Categories:

Updated:

Leave a comment