-
[2021 KAKAO BLIND RECRUITMENT] 메뉴 리뉴얼 (파이썬)Coding Test/Algorithm 2021. 9. 11. 04:55
오늘 있는 코딩 테스트를 대비해서 열심히 문제를 풀고 있다..
https://programmers.co.kr/learn/courses/30/lessons/72411
해당 문제를 부분집합이라는 개념에 접근하여 풀어보았다.
https://www.welcomekakao.com/learn/courses/30/lessons/42890
동빈나 선생님의 후보키 풀이법을 보면 부분집합을 이용하여 푸는 방식이 나오는데 그걸 활용해서 메뉴 리뉴얼도 풀었다.
(배운걸 잘 실천하는 모범 학생)정답률 25%문제를 풀게된 것이라 뿌듯하며 언제쯤 1자리 수 합격률의 문제를 안 보고 풀 수 있을련지...
해당 문제를 푸는데 중요하게 생각 한 것은 두가지 였다.
1. 코스요리 후보를 생성하는 것
2. 가장 많이 주문한 후보를 추리는 것
첫번째 코스요리 후보를 생성하는 것은 부분집합을 이용하면 쉽게 할 수 있다.
def get_all_subset(iterable): s = list(iterable) return chain.from_iterable(combinations(s, r) for r in range(len(s) + 1))
라는 함수를 이용하면 쉽게 부분집합을 생성할 수가 있다.
이제 딕셔너리를 하나 생성하고 거기에 후보를 담기 시작한다.
dic = {} orders = sorted(orders) for i in range(len(orders)): orders[i] = sorted(list(orders[i])) for i in range(len(orders)): subset_list = get_all_subset(list(range(0, len(orders[i])))) for j in subset_list: if len(j) in course: string = '' for k in j: string += orders[i][k] if string in dic: dic[string] += 1 else: dic[string] = 1
for문을 통해 차례대로 부분집합을 생성해주고 course에 해당하는 길이의 부분집합을 불러오고 dic에 있다면 value를 올려서 counting 해주고 없다면 새로 생성한다.
이렇게 해주면 첫번째 할일은 끝난다.
두번째로 중요한 가장 많이 시킨 후보군을 고르는 것은 흔히 수동으로(?) 만들던 max 기능을 구현해서 사용하면 된다.
tmp = [0] * 10 tmp_answer = [['']] * 10 for key, val in dic.items(): if val >= 2: l = len(key)-1 if tmp[l] < val: tmp[l] = val tmp_answer[l] = [key] elif tmp[l] == val: tmp_answer[l].append(key)
이후 tmp_answer의 값을 예쁘게 answer에 담아서 제출하였다.
'Coding Test > Algorithm' 카테고리의 다른 글
[백준] 2473번 세 용액 (파이썬, 두 포인터) (0) 2021.10.29 [백준] 2239번 스도쿠 (파이썬, DFS) (0) 2021.10.27 [백준] 2467번 용액 (파이썬) (0) 2021.08.08 [백준] 2166번 다각형의 면적(파이썬) (0) 2021.08.06 [백준] 나이순 정렬 (10814번 파이썬) (0) 2021.07.16